在error_log中编辑前置日期格式

Sdl*_*ion 10 php error-logging

PHP 5.6

有一些方法可以定义使用时显示的日期格式error_log吗?

我用它来记录某个脚本的消息和错误.似乎set_error_handler 不会处理所有错误消息.

在某些例子中,人们将日期date直接添加到参数上error_log.使用这种方法会导致我在日志文件中重复日期字符串.

我想输出一个ISO格式的本地日期时间,但是php -f script.php我所使用的CLI()和Apache之前的日期

ini_set('log_errors', 1);
ini_set('error_log', 'file.log');
error_log('Test');
Run Code Online (Sandbox Code Playgroud)

是这样的:

[14-Feb-2016 18:07:31 America/Mexico_City] Test
Run Code Online (Sandbox Code Playgroud)

注意到在大多数代码示例中,日期格式通常不包括时区.如果我从控制台运行它,我不会得到前置日期:

$ php -r 'error_log("Test");'
Test
Run Code Online (Sandbox Code Playgroud)

时区未在运行时或php.ini中设置,但正确表示.我在php5.6.18包上得到了这个行为,并从源代码php5.6.13编译.在生产服务器上,脚本正在通过CLI运行,没有安装apache.

看来error_log显示的日期不可自定义.set_error_handler按照@ fusion3k的建议继续前进我将这个错误处理程序放在一起,它将使用更加计算机/人性化的格式格式化日期,消息和错误级别

// set_trigger_error only accepts E_USER_ constants values
define('ERROR', 256);   // Before E_USER_ERROR
define('INFO',  512);   // Before E_USER_WARNING
define('DEBUG', 1024);  // Before E_USER_NOTICE

function errorHandler ($errType, $errStr, $errFile, $errLine, $errContext) {
    $displayErrors = ini_get( 'display_errors' );
    $logErrors     = ini_get( 'log_errors' );
    $errorLog      = ini_get( 'error_log' );

    if( $displayErrors ) echo $errStr.PHP_EOL;

    if( $logErrors ) {
        $line = "";
        switch ($errType) {
            case DEBUG: 
                $type = 'DEBUG'; 
                break;
            case INFO: 
                $type = 'INFO'; 
                break;
            case ERROR: 
                $type = 'ERROR'; 
                $line = " (Line:".$errLine.")";
                break;
            default: 
                $type = 'WARN'; 
                $line = " (Line:".$errLine.")";
                break;
        }
        $message = date('Y-m-d H:i:sO').";".$type.";".$errStr.$line;
        file_put_contents($errorLog, $message.PHP_EOL, FILE_APPEND);
    }
}

set_error_handler('errorHandler');

error_reporting(E_ALL);
ini_set('log_errors', 1);
ini_set('error_log', 'test.log');

trigger_error('Test', DEBUG);
Run Code Online (Sandbox Code Playgroud)

产量

2016-02-15 14:20:05-0600;DEBUG;Test
Run Code Online (Sandbox Code Playgroud)

fus*_*n3k 6

如果您使用自定义错误日志文件,您可以简单地将首选日期格式添加到日志消息中。

如果使用标准的Apache 日志文件,则无法通过 php 修改日志格式。

您必须httpd.conf通过LogFormat关键字修改整个 Apache 错误日志格式:用您想要的格式替换现有格式。

在这里您可以找到完整的LogFormat.

编辑:

在您上次评论后,我通过互联网搜索并进行了一些测试,然后我意识到我之前的答案不正确:无法修改 php.ini 中的error_log()行为。就我而言(我安装了 Apache),即使在自定义日志文件(通过 定义)上,error_log()函数也会输出 Apache 日志格式ini_set('error_log')

在你的情况下,我认为 php 使用操作系统日志格式(你确定你没有安装 Apache,即使你不使用它?)。

替代方法:trigger_error()

您可以使用trigger_error()- 结合set_error_handler()- 而不是error_log()

function myErrorHandler( $errType, $errStr, $errFile, $errLine, $errContext )
{
    $displayErrors = ini_get( 'display_errors' );
    $logErrors     = ini_get( 'log_errors' );
    $errorLog      = ini_get( 'error_log' );

    if( $displayErrors ) echo $errStr.PHP_EOL;

    if( $logErrors )
    {
        $message = sprintf( '[%s] %s (%s, %s)', date('d-m H:i'), $errStr, $errFile, $errLine );
        file_put_contents( $errorLog, $message.PHP_EOL, FILE_APPEND );
    }
}

ini_set( 'log_errors', 1 );
ini_set( 'error_log', 'file.log' );

set_error_handler( 'myErrorHandler' );
trigger_error( 'Test' );
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,trigger_error将在file.log 中添加如下一行:

[15-02 09:43] Test (Script/File/Path.php, 12)
Run Code Online (Sandbox Code Playgroud)

设置error_handler 所有系统错误都由自定义函数处理。要模拟系统错误,您必须使用trigger_error()代替error_log()

为了最大限度地自定义,您可以传递给trigger_error附加参数error_type

trigger_error( 'Test', E_WARNING );
Run Code Online (Sandbox Code Playgroud)

将产生警告级别错误;默认error_type值为E_USER_NOTICE. 错误类型是$errType自定义函数中的第一个参数 ( ),因此在自定义错误处理函数中,您可以根据错误类型修改行为。

在我上面的简单示例中,自定义函数还处理了一些ini指令,因此您可以ini_setset_error_handler. 请注意,您可以更改自定义函数参数的变量名称,但不能更改顺序,因为这是由 php 内部错误系统定义的。

如果您决定使用set_error_handler(),请仔细阅读文档以了解行为和异常。