PHP 5.6
Есть ли способ определить формат даты, отображаемой при использовании error_log
?
Я использую его для регистрации сообщений и ошибок из определенного скрипта. Похоже, что set_error_handler
не будет обрабатывать все сообщения об ошибках.
В некоторых примерах люди добавляют дату с date
непосредственно к аргументам error_log
. Использование этого подхода привело бы меня к повторяющейся строке даты в моем файле журнала.
Я хочу вывести локальное время даты в формате 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 и скомпилированном из исходного кода 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);
Выход
2016-02-15 14:20:05-0600;DEBUG;Test
LOG_INFO
,LOG_DEBUG
и другие подобные константы уже определены для функцииsyslog
. php.net/manual/es/function.syslog.php - person Sdlion   schedule 15.02.2016