【发布时间】:2016-05-25 19:37:25
【问题描述】:
PHP 5.6
有什么方法可以定义使用error_log 时显示的日期格式吗?
我正在使用它来记录来自某个脚本的消息和错误。好像是set_error_handlerwon'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
时区未在运行时或 php.ini 中设置,但已正确表示。我在php5.6.18 package 和从源代码 php5.6.13 编译时得到了这种行为。在生产服务器上,脚本通过 CLI 运行,没有安装 apache。
解决方案
似乎 error_log 显示的日期不可自定义。
按照@fusion3k 的建议,继续使用set_error_handler,我将这个错误处理程序放在一起,它将以更计算机/人类友好的格式格式化日期、消息和错误级别
// 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
【问题讨论】:
-
注意:
LOG_INFO、LOG_DEBUG和其他类似的常量已经为syslog函数定义了。 php.net/manual/es/function.syslog.php
标签: php error-logging