Create error log file in php

We all know that PHP save errors in php_errors.log file.

But, that file contains a lot of data.

If we want to log our application data, we need to save it to a custom location.

We can use two parameters in the error_log function to achieve this.

http://php.net/manual/en/function.error-log.php

We can do it using:

error_log(print_r($v, TRUE), 3, '/var/tmp/errors.log');

Where,

print_r($v, TRUE) : logs $v (array/string/object) to log file. 3: Put log message to custom log file specified in the third parameter.

'/var/tmp/errors.log': Custom log file (This path is for Linux, we can specify other depending upon OS).

OR, you can use file_put_contents()

file_put_contents('/var/tmp/e.log', print_r($v, true), FILE_APPEND);

Where:

'/var/tmp/errors.log': Custom log file (This path is for Linux, we can specify other depending upon OS). print_r($v, TRUE) : logs $v (array/string/object) to log file. FILE_APPEND: Constant parameter specifying whether to append to the file if it exists, if file does not exist, new file will be created.

View Discussion

Improve Article

Save Article

  • Read
  • Discuss
  • View Discussion

    Improve Article

    Save Article

    In PHP, errors and warnings can be logged into a file by using a php script and changing configuration of php.ini file. Two such approaches are mentioned below:

    Approach 1: The error_log() function can be used to send error messages to a given file. First argument to the function is the error message to be sent. Second argument tells where to send/log the error message. In this case, second argument is set to 3, used to redirect error message to a file. Third argument is used to specify the file path of the error logging file.

    Below is the implementation of the above approach:

    <?php

    $error_message = "This is an error message!";

    $log_file = "./my-errors.log";

    error_log($error_message, 3, $log_file);

    ?>

    Output:

    [20-Dec-2018 17:32:00 UTC] This is an error message!

    Approach 2:

    • The init_set() function allows a user to programmatically update configuration of the php.ini file.
    • The ini_set(“log_errors”, TRUE) command can be added to the php script to enable error logging in php.
    • The ini_set(‘error_log’, $log_file) command can be added to the php script to set the error logging file.
    • Further error_log($error_message) function call can be used to log error message to the given file.

    Below is the implementation of the above approach:

    <?php

    $error_message = "This is an error message!";

    $log_file = "./my-errors.log";

    ini_set("log_errors", TRUE); 

    ini_set('error_log', $log_file);

    error_log($error_message);

    ?>

    Output:

    [20-Dec-2018 17:30:35 UTC] This is an error message!

    Similar Approach: Following lines can also be added directly to php.ini to make the configuration changes permanent for every php script that logs errors and warnings.

    log_errors = on
    error_log = ./errors.log
    

    Note:: This approach is not highly reliable as compared to other approaches. Its better to use approach 1 as it gives flexibility of choosing different files for logging at same time without changing configuration of php.ini file.


    (PHP 4, PHP 5, PHP 7, PHP 8)

    error_logSend an error message to the defined error handling routines

    Description

    error_log(
        string $message,
        int $message_type = 0,
        ?string $destination = null,
        ?string $additional_headers = null
    ): bool

    Parameters

    message

    The error message that should be logged.

    message_type

    Says where the error should go. The possible message types are as follows:

    error_log() log types
    0 message is sent to PHP's system logger, using the Operating System's system logging mechanism or a file, depending on what the error_log configuration directive is set to. This is the default option.
    1 message is sent by email to the address in the destination parameter. This is the only message type where the fourth parameter, additional_headers is used.
    2 No longer an option.
    3 message is appended to the file destination. A newline is not automatically added to the end of the message string.
    4 message is sent directly to the SAPI logging handler.
    destination

    The destination. Its meaning depends on the message_type parameter as described above.

    additional_headers

    The extra headers. It's used when the message_type parameter is set to 1. This message type uses the same internal function as mail() does.

    Return Values

    Returns true on success or false on failure. If message_type is zero, this function always returns true, regardless of whether the error could be logged or not.

    Changelog

    VersionDescription
    8.0.0 destination and additional_headers are now nullable.

    Examples

    Example #1 error_log() examples

    <?php
    // Send notification through the server log if we can not
    // connect to the database.
    if (!Ora_Logon($username$password)) {
        
    error_log("Oracle database not available!"0);
    }
    // Notify administrator by email if we run out of FOO
    if (!($foo allocate_new_foo())) {
        
    error_log("Big trouble, we're all out of FOOs!"1,
                   
    "");
    }
    // another way to call error_log():
    error_log("You messed up!"3"/var/tmp/my-errors.log");
    ?>

    Notes

    Warning

    error_log() is not binary safe. message will be truncated by null character.

    Tip

    message should not contain null character. Note that message may be sent to file, mail, syslog, etc. Use appropriate conversion/escape function, base64_encode(), rawurlencode() or addslashes() before calling error_log().

    kevindougans at gmail dot com

    12 years ago

    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.

    Sion

    3 years ago

    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 ) );

    frank at booksku dot com

    15 years ago

    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!

    i dot buttinoni at intandtel dot com

    14 years ago

    Be carefull. Unexpected PHP dies when 2GByte of file log reached (on systems having upper file size limit).
    A work aorund is rotate logs :)

    php at kennel17 dot NOSPAM dot co dot uk

    17 years ago

    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.

    Anonymous

    19 years ago

    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, "",
     
    "Subject: Foo\nFrom: \n");?>

    ---------------%<-----------------------
    To:
    Envelope-to:
    Date: Fri, 28 Mar 2003 13:29:02 -0500
    From:
    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

    russ at russtanner dot com

    2 years ago

    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".

    paul dot chubb at abs dot gov dot au

    14 years ago

    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);
    }

    SJL

    14 years ago

    "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.

    stepheneliotdewey at GmailDotCom

    15 years ago

    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.

    Matthew Swift

    2 years ago

    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.

    p dot lhonorey at nospam-laposte dot net

    16 years ago

    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,"","subject  :lunch\nContent-Type: text/html; charset=ISO-8859-1");

    Enjoy !

    franz at fholzinger dot com

    17 years ago

    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

    eguvenc at gmail dot com

    13 years ago

    <?php
    //Multiline error log class
    // ersin güvenç 2008
    //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
    ?>

    daniel dot fukuda at gmail dot com

    13 years ago

    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.

    Robert Chapin

    3 years ago

    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'); ?>

    Anonymous

    1 year ago

    Depending on the error, you may also want to add an error 500 header, and a message for the user:

    $message =  'Description of the error.';
    error_log($message);
    header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
    exit($message);

    kazezb at nospam dot carleton dot edu

    17 years ago

    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.

    Anonymous

    13 years ago

    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

    How do you create an error log?

    6 Ways To Make Error Logs Your New Secret Weapon.
    Don't treat all errors the same. ... .
    Make sure each error log provides context. ... .
    Monitor frequency next to the context. ... .
    Make error log history easy to search. ... .
    Critical Errors need real time alerts. ... .
    Use the right channel to monitor error logs..

    How do I log errors and warnings into a file in PHP?

    The ini_set(“log_errors”, TRUE) command can be added to the php script to enable error logging in php. The ini_set('error_log', $log_file) command can be added to the php script to set the error logging file. Further error_log($error_message) function call can be used to log error message to the given file.

    Where is the PHP error log?

    The location of the error log file itself can be set manually in the php. ini file. On a Windows server, in IIS, it may be something like "'error_log = C:\log_files\php_errors. log'" in Linux it may be a value of "'/var/log/php_errors.

    How do I log messages in PHP?

    Log messages can be generated manually by calling error_log() or automatically when notices, warnings, or errors come up during execution. By default, the error log in PHP is disabled. You can enable the error log in one of two ways: by editing php. ini or by using ini_set.