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 отсутствует.
Кажется, что дата, которая отображается с ошибкой_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
Если вы используете свой пользовательский файл журнала ошибок, Вы можете просто добавить предпочитаемый формат даты в журнал сообщений.
Если вы используете стандарт Файл журнала Apache, Вы не можете изменить формат журнала через php.
Вместо этого вы должны изменить весь формат журнала ошибок Apache в httpd.conf
через LogFormat
Ключевое слово: заменить существующий формат на нужный формат.
Вот Вы можете найти полное руководство по синтаксису для LogFormat
,
После вашего последнего комментария я провел поиск в интернете и провел несколько тестов, а затем понял, что мой предыдущий ответ неверен: изменить его невозможно error_log()
поведение в php. В моем случае (у меня установлен Apache), error_log()
функция выводит формат журнала Apache четное в пользовательском файле журнала (определяется через ini_set('error_log')
).
В вашем случае, я думаю, что php использует формат журнала ОС (вы уверены, что у вас не установлен Apache, даже если вы его не используете?).
Вы можете установить полностью настраиваемый формат журнала ошибок, используя 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()
прочитайте внимательно документация понимать поведение и исключения.
(Я скопировал ответ из @Sdlion в его собственный ответ, чтобы мы могли проголосовать за него)
Кажется, что дата, которая отображается с ошибкой_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