Отредактируйте предварительно добавленный формат даты в error_log

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

9

Решение

Если вы используете свой пользовательский файл журнала ошибок, Вы можете просто добавить предпочитаемый формат даты в журнал сообщений.

Если вы используете стандарт Файл журнала Apache, Вы не можете изменить формат журнала через php.

Вместо этого вы должны изменить весь формат журнала ошибок Apache в httpd.conf через LogFormat Ключевое слово: заменить существующий формат на нужный формат.

Вот Вы можете найти полное руководство по синтаксису для LogFormat,

Редактировать:

После вашего последнего комментария я провел поиск в интернете и провел несколько тестов, а затем понял, что мой предыдущий ответ неверен: изменить его невозможно error_log() поведение в php. В моем случае (у меня установлен 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' );

В приведенном выше примере 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()прочитайте внимательно документация понимать поведение и исключения.


4

Другие решения

(Я скопировал ответ из @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
2

По вопросам рекламы [email protected]