在 error_log 中编辑前置日期格式
Edit prepended date format in error_log
PHP 5.6
有什么方法可以定义使用 error_log
时显示的日期格式?
我用它来记录来自某个脚本的消息和错误。好像是 set_error_handler
won't handle all error messages.
在某些示例中,人们直接在 error_log
的参数上添加日期 date
。使用这种方法会导致我在日志文件中出现重复的日期字符串。
我想输出一个 ISO 格式的本地日期时间,但是我使用
获得的 CLI (php -f script.php
) 和 Apache 前面加上日期
ini_set('log_errors', 1);
ini_set('error_log', 'file.log');
error_log('Test');
是这样的:
[14-Feb-2016 18:07:31 America/Mexico_City] Test
请注意,在大多数代码示例中,日期格式通常不包括时区。如果我从控制台 运行 它,我不会得到前面的日期:
$ php -r 'error_log("Test");'
Test
未在 运行time 或 php.ini 中设置时区,但显示正确。我在 php5.6.18 package 和从源代码 php5.6.13 编译的版本上得到了这种行为。在生产服务器上,脚本通过 CLI 运行,没有安装 apache。
解决方案
error_log显示的日期似乎无法自定义。
按照@fusion3k 的建议继续 set_error_handler
我将这个错误处理程序放在一起,它将使用更 computer/human 友好的格式
格式化日期、消息和错误级别
// 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);
输出
2016-02-15 14:20:05-0600;DEBUG;Test
如果您使用 自定义错误日志文件, 您可以简单地在日志消息前添加您首选的日期格式。
如果您使用标准 Apache 日志文件, 您无法通过 php.
修改日志格式
您必须通过 LogFormat
关键字修改 httpd.conf
中的整个 Apache 错误日志格式:用您想要的格式替换现有格式。
Here 您可以找到 LogFormat
.
的完整语法指南
编辑:
在你最后的评论之后,我通过互联网搜索并进行了一些测试,然后我意识到我之前的答案是不正确的:没有办法修改 [=97= 中的 error_log()
行为].在我的例子中(我安装了 Apache),error_log()
函数在自定义日志文件(通过 ini_set('error_log')
定义)上输出 Apache 日志格式 even。
在你的情况下,我认为 php 使用 OS 日志格式(你确定你没有安装 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' );
在上面的例子中,trigger_error
将附加到 file.log 这样一行:
[15-02 09:43] Test (Script/File/Path.php, 12)
设置error_handler
所有系统错误由自定义函数处理。要模拟系统错误,您必须使用 trigger_error()
而不是 error_log()
。
要最大化自定义,您可以传递给 trigger_error
附加参数 error_type
:
trigger_error( 'Test', E_WARNING );
会产生警告级别错误;默认 error_type
值为 E_USER_NOTICE
。错误类型是自定义函数中的第一个参数 ($errType
),因此在自定义错误处理函数中,您可以根据错误类型修改行为。
在我上面的简单示例中,自定义函数还处理一些 ini
指令,因此您可以将 ini_set
与 set_error_handler
结合使用。请注意,您可以更改自定义函数参数的变量名称,但不能更改顺序,因为这是由内部php 错误系统定义的。
如果您决定使用 set_error_handler()
,请仔细阅读 documentation 以了解行为和例外情况。
- 阅读更多关于 set_error_handler
- 阅读更多关于 trigger_error
- 阅读更多关于 error types
(我将@Sdlion 的答案复制到它自己的答案中,以便我们对其进行投票)
error_log显示的日期似乎无法自定义。按照@fusion3k 的建议继续 set_error_handler 我将这个错误处理程序放在一起,它将使用更 computer/human 友好的格式
格式化日期、消息和错误级别
// 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);
输出
2016-02-15 14:20:05-0600;DEBUG;Test
PHP 5.6
有什么方法可以定义使用 error_log
时显示的日期格式?
我用它来记录来自某个脚本的消息和错误。好像是 set_error_handler
won't handle all error messages.
在某些示例中,人们直接在 error_log
的参数上添加日期 date
。使用这种方法会导致我在日志文件中出现重复的日期字符串。
我想输出一个 ISO 格式的本地日期时间,但是我使用
获得的 CLI (php -f script.php
) 和 Apache 前面加上日期
ini_set('log_errors', 1);
ini_set('error_log', 'file.log');
error_log('Test');
是这样的:
[14-Feb-2016 18:07:31 America/Mexico_City] Test
请注意,在大多数代码示例中,日期格式通常不包括时区。如果我从控制台 运行 它,我不会得到前面的日期:
$ php -r 'error_log("Test");'
Test
未在 运行time 或 php.ini 中设置时区,但显示正确。我在 php5.6.18 package 和从源代码 php5.6.13 编译的版本上得到了这种行为。在生产服务器上,脚本通过 CLI 运行,没有安装 apache。
解决方案
error_log显示的日期似乎无法自定义。
按照@fusion3k 的建议继续 set_error_handler
我将这个错误处理程序放在一起,它将使用更 computer/human 友好的格式
// 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);
输出
2016-02-15 14:20:05-0600;DEBUG;Test
如果您使用 自定义错误日志文件, 您可以简单地在日志消息前添加您首选的日期格式。
如果您使用标准 Apache 日志文件, 您无法通过 php.
修改日志格式您必须通过 LogFormat
关键字修改 httpd.conf
中的整个 Apache 错误日志格式:用您想要的格式替换现有格式。
Here 您可以找到 LogFormat
.
编辑:
在你最后的评论之后,我通过互联网搜索并进行了一些测试,然后我意识到我之前的答案是不正确的:没有办法修改 [=97= 中的 error_log()
行为].在我的例子中(我安装了 Apache),error_log()
函数在自定义日志文件(通过 ini_set('error_log')
定义)上输出 Apache 日志格式 even。
在你的情况下,我认为 php 使用 OS 日志格式(你确定你没有安装 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' );
在上面的例子中,trigger_error
将附加到 file.log 这样一行:
[15-02 09:43] Test (Script/File/Path.php, 12)
设置error_handler
所有系统错误由自定义函数处理。要模拟系统错误,您必须使用 trigger_error()
而不是 error_log()
。
要最大化自定义,您可以传递给 trigger_error
附加参数 error_type
:
trigger_error( 'Test', E_WARNING );
会产生警告级别错误;默认 error_type
值为 E_USER_NOTICE
。错误类型是自定义函数中的第一个参数 ($errType
),因此在自定义错误处理函数中,您可以根据错误类型修改行为。
在我上面的简单示例中,自定义函数还处理一些 ini
指令,因此您可以将 ini_set
与 set_error_handler
结合使用。请注意,您可以更改自定义函数参数的变量名称,但不能更改顺序,因为这是由内部php 错误系统定义的。
如果您决定使用 set_error_handler()
,请仔细阅读 documentation 以了解行为和例外情况。
- 阅读更多关于 set_error_handler
- 阅读更多关于 trigger_error
- 阅读更多关于 error types
(我将@Sdlion 的答案复制到它自己的答案中,以便我们对其进行投票)
error_log显示的日期似乎无法自定义。按照@fusion3k 的建议继续 set_error_handler 我将这个错误处理程序放在一起,它将使用更 computer/human 友好的格式
格式化日期、消息和错误级别// 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);
输出
2016-02-15 14:20:05-0600;DEBUG;Test