• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • error_log()

    (PHP 4, PHP 5, PHP 7)

    发送错误信息到某个地方

    说明

    error_log(string $message[,int $message_type= 0[,string $destination[,string $extra_headers]]]): bool

    把错误信息发送到 web 服务器的错误日志,或者到一个文件里。

    参数

    $message

    应该被记录的错误信息。

    $message_type

    设置错误应该发送到何处。可能的信息类型有以下几个:

    error_log()日志类型
    0$message发送到 PHP 的系统日志,使用操作系统的日志机制或者一个文件,取决于error_log指令设置了什么。这是个默认的选项。
    1$message发送到参数$destination设置的邮件地址。第四个参数$extra_headers只有在这个类型里才会被用到。
    2不再是一个选项。
    3$message被发送到位置为$destination的文件里。字符$message不会默认被当做新的一行。
    4$message直接发送到 SAPI 的日志处理程序中。
    $destination

    目标。它的含义描述于以上,由$message_type参数所决定。

    $extra_headers

    额外的头。当$message_type设置为1的时候使用。该信息类型使用了mail()的同一个内置函数。

    返回值

    成功时返回TRUE,或者在失败时返回FALSE

    注释

    Warning

    error_log()并非二进制安全的。null 字符可能截断$message

    Tip

    $message不能包含 null 字符。注意,$message可能会发送到文件、邮件、syslog 等。所以在调用error_log()前需要使用适合的转换/转义函数:base64_encode()、rawurlencode()或addslashes()。

    范例

    Example #1error_log()范例

    <?php
    // 如果无法连接到数据库,发送通知到服务器日志
    if (!Ora_Logon($username, $password)) {
        error_log("Oracle database not available!", 0);
    }
    // 如果用尽了 FOO,通过邮件通知管理员
    if (!($foo = allocate_new_foo())) {
        error_log("Big trouble, we're all out of FOOs!", 1,
                   "operator@example.com");
    }
    // 调用 error_log() 的另一种方式:
    error_log("You messed up!", 3, "/var/tmp/my-errors.log");
    ?>
    

    更新日志

    版本说明
    5.2.7可能的值:4添加到了$message_type
    Advice to novices: This function works great along with "tail" which is a unix command to watch a log file live. There are versions of Tail for Windows too, like Tail for Win32 or Kiwi Log Viewer.
    Using both error_log() and tail to view the php_error.log you can debug code without having to worry so much about printing debug messages to the screen and who they might be seen by.
    Further Note: This works even better when you have two monitors setup. One for your browser and IDE and the other for viewing the log files update live as you go.
    DO NOT try to output TOO LARGE texts in the error_log();
    if you try to output massive amounts of texts it will either cut of the text at about 8ooo characters (for reasonable massive strings, < 32 K characters) or (for insanely massive strings, about 1.6 million characters) totally crash without even throwing an error or anything (I even put it in a try/catch without getting any result from the catch).
    I had this problem when I tried to debug a response from a wp_remote_get(); all of my error_log() worked as they should, except for ONE of them... (-_-)
    After about a day of debugging I finally found out why & that's why I type this.
    Apparently the response contained a body with over 1.6 million chars (or bytes? (whatever strlen() returns)).
    If you have a string of unknown length, use this:
    $start_index = 0;
    $end_index = 8000;
    error_log( substr( $output_text , $start_index , $end_index ) );
    There is a limit on the maximum length that you can pass as the $message.
    The default seem to be 1024 but can be changed by adjusting the value of the runtime configuration value of 'log_errors_max_len'.
    More details here:
    http://www.php.net/manual/en/errorfunc.configuration.php
    Beware! If multiple scripts share the same log file, but run as different users, whichever script logs an error first owns the file, and calls to error_log() run as a different user will fail *silently*!
    Nothing more frustrating than trying to figure out why all your error_log calls aren't actually writing, than to find it was due to a *silent* permission denied error!
    It appears that the system log = stderr if you are running PHP from the command line, and that often stderr = stdout. This means that if you are using a custom error to both display the error and log it to syslog, then a command-line user will see the same error reported twice.
    Be carefull. Unexpected PHP dies when 2GByte of file log reached (on systems having upper file size limit). 
    A work aorund is rotate logs :)
    when using error_log to send email, not all elements of an extra_headers string are handled the same way. "From: " and "Reply-To: " header values will replace the default header values. "Subject: " header values won't: they are *added* to the mail header but don't replace the default, leading to mail messages with two Subject fields.
    <?php
    error_log("sometext", 1, "zigzag@my.domain", 
     "Subject: Foo\nFrom: Rizzlas@my.domain\n");
    ?>
    ---------------%<-----------------------
    To: zigzag@my.domain
    Envelope-to: zigzag@my.domain
    Date: Fri, 28 Mar 2003 13:29:02 -0500
    From: Rizzlas@my.domain
    Subject: PHP error_log message
    Subject: Foo
    Delivery-date: Fri, 28 Mar 2003 13:29:03 -0500
    sometext
    ---------------%<---------------------
    quoth the docs: "This message type uses the same internal function as mail() does." 
    mail() will also fail to set a Subject field based on extra_header data - instead it takes a seperate argument to specify a "Subject: " string.
    php v.4.2.3, SunOS 5.8
    When logging to apache on windows, both error_log and also trigger_error result in an apache status of error on the front of the message. This is bad if all you want to do is log information. However you can simply log to stderr however you will have to do all message assembly:
    LogToApache($Message) {
        $stderr = fopen('php://stderr', 'w'); 
        fwrite($stderr,$Message); 
        fclose($stderr); 
    }
    Note that since typical email is unencrypted, sending data about your errors over email using this function could be considered a security risk. How much of a risk it is depends on how much and what type of information you are sending, but the mere act of sending an email when something happens (even if it cannot be read) could itself imply to a sophisticated hacker observing your site over time that they have managed to cause an error.
    Of course, security through obscurity is the weakest kind of security, as most open source supporters will agree. This is just something that you should keep in mind. 
    And of course, whatever you do, make sure that such emails don't contain sensitive user data.
    "It appears that the system log = stderr if you are running PHP from the command line"
    Actually, it seems that PHP logs to stderr if it can't write to the log file. Command line PHP falls back to stderr because the log file is (usually) only writable by the webserver.
    Relative paths are accepted as the destination of message_type 3, but beware that the root directory is determined by the context of the call to error_log(), which can change, so that one instance of error_log () in your code can lead to the creation of multiple log files in different locations.
    In a WordPress context, the root directory will be the site's root in many cases, but it will be /wp-admin/ for AJAX calls, and a plugin's directory in other cases. If you want all your output to go to one file, use an absolute path.
    You can easily filter messages sent to error_log() using "tail" and "grep" on *nix systems. This makes monitoring debug messages easy to see during development.
    Be sure to "tag" your error message with a unique string so you can filter it using "grep":
    In your code:
    error_log("DevSys1 - FirstName: $FirstName - LastName: $Lastname");
    On your command line:
    tail -f /var/log/httpd/error_log | grep DevSys1
    In this example, we pipe apache log output to grep (STDIN) which filters it for you only showing messages that contain "DevSys1".
    The "-f" option means "follow" which streams all new log entries to your terminal or to any piped command that follows, in this case "grep".
    In the case of missing your entries in the error_log file:
    When you use error_log in a script that does not produce any output, which means that you cannot see anything during the execution of the script, and when you wonder why there are no error_log entries produced in your error_log file, the reasons can be:
    - you did not configure error_log output in php.ini
    - the script has a syntax error and did therefore not execute
    Hi !
    Another trick to post "HTML" mail body. Just add "Content-Type: text/html; charset=ISO-8859-1" into extra_header string. Of course you can set charset according to your country or Env or content.
    EG: Error_log("<html><h2>stuff</h2></html>",1,"eat@joe.com","subject :lunch\nContent-Type: text/html; charset=ISO-8859-1");
    Enjoy !
    <?php
    //Multiline error log class
    // ersin güvenç 2008 eguvenc@gmail.com
    //For break use "\n" instead '\n'
    Class log {
     //
     const USER_ERROR_DIR = '/home/site/error_log/Site_User_errors.log';
     const GENERAL_ERROR_DIR = '/home/site/error_log/Site_General_errors.log';
     /*
      User Errors...
     */
      public function user($msg,$username)
      {
      $date = date('d.m.Y h:i:s');
      $log = $msg."  | Date: ".$date." | User: ".$username."\n";
      error_log($log, 3, self::USER_ERROR_DIR);
      }
      /*
      General Errors...
     */
      public function general($msg)
      {
      $date = date('d.m.Y h:i:s');
      $log = $msg."  | Date: ".$date."\n";
      error_log($msg."  | Tarih: ".$date, 3, self::GENERAL_ERROR_DIR);
      }
    }
    $log = new log();
    $log->user($msg,$username); //use for user errors
    //$log->general($msg); //use for general errors
    ?>
    
    If you have a problem with log file permission *silently*
    it's best to leave error_log directive unset so errors will be written in your Apache log file for current VirtualHost.
    After scouring the internet for getting event logging to 
    work in syslog on Windows 2003, I found the following 
    from this post and was able to successfully get Windows 
    Event Viewer to log PHP errors/notices:
    http://forums.iis.net/p/1159662/1912015.aspx#1913338
      1. Copy the PHP 5 binaries to "C:\php".
      2. Right-click My Computer and select Properties to bring 
    up the Computer Properties dialog. Switch to the Advanced 
    tab and click Environment Variables. Find the system 
    environment variable PATH, edit it and add ";C:\php" 
    (without the quotes) to the end.
      3. Make sure that the configuration file "php.ini" resides 
    in the directory "C:\php" and contains the correct path 
    settings.
      4. DELETE any old "php.ini" files from "C:\WINDOWS" 
    and other directories.
      5. Open REGEDIT, navigate to the key 
    "HKLM\SOFTWARE\PHP" and DELETE the string value 
    "IniFilePath" from there. It is outdated and no longer 
    necessary!
      6. Modify NTFS security permissions of the directory 
    "C:\php" to give Read and Execute permissions to (1) the 
    IIS Guest Account and (2) the group IIS_WPG.
      7. Modify NTFS security permissions of the directories 
    "C:\php\session" and "C:\php\upload" to give additional 
    Modify permissions to (1) the IIS Guest Account and (2) 
    the group IIS_WPG.
      8. Navigate to the registry key 
    "HKLM\SYSTEM\CurrentControlSet\Services\Eventlog
    \Application" and edit the value "CustomSD" there. Find 
    the substring "(D;;0xf0007;;;BG)" which Denies access to 
    the application event log for Builtin Guest accounts (like 
    the IIS Web User account) and replace this substring with 
    "(A;;0x3;;;BG)" which allows read and write access. Please 
    pay attention to leave the rest of the security string intact. 
    Damaging this value can have dangerous effects!
      9. Create or update the registry key 
    "HKLM\SYSTEM\CurrentControlSet\Services\Eventlog\Application\
    PHP-5.2.0" (adapt the last to your version part 
    if necessary) with the following values:
         * "EventMessageFile" (REG_EXPAND_SZ) = "C:\php\php5ts.dll"
         * "TypesSupported" (REG_DWORD) = 7
    It appears that error_log() only logs the first line of multi-line log messages. To log a multi-line message, either log each line individually or write the message to another file.
    When error_log() unexpectedly uses stdout, you should check if the php.ini value for error_log is empty in your CLI environment. Something as simple as this might restore expected behavior:
    <?php ini_set('error_log', 'error_log'); ?>