Регистрация ошибок PHP с помощью Syslog-NG

У меня есть несколько журналов, собранных на сервере мониторинга с использованием Syslog-NG, которые:

  • копируется в локальный файл с ежедневной ротацией,
  • хранится в базе данных MySQL.

К сожалению, никаких ошибок не возникает, поскольку они оцениваются как уведомления PHP (см. этот пост).

Следовательно, мне интересно, как правильно использовать Syslog-NG для обработки ошибок PHP, чтобы они действительно распознавались как ошибки.


person David    schedule 06.05.2013    source источник
comment
Вы смотрели syslog?   -  person quickshiftin    schedule 07.05.2013


Ответы (2)


Несколько вещей/вариантов здесь. В этой статье не упоминается настройка php.ini для использования системного журнала для ведения журнала ошибок внутри php. Вам нужно будет установить

error_log = syslog

Я предполагаю, что это было упомянуто в статье, где говорится

У PHP есть раздражающая привычка регистрировать все с уровнем ошибки NOTICE.

Таким образом, вы можете включить ведение журнала ошибок в системный журнал и следовать шаманству системного журнала, предложенному в этой статье, или вы можете сделать это способом PHP, и под этим я подразумеваю использование большего количества PHP для реализации сопоставления между Ошибки PHP и уровни ошибок системного журнала.

Определите собственный обработчик ошибок с помощью set_error_handler, затем внутри обработчика сопоставьте конкретную ошибку PHP с определенным уровнем ошибки системного журнала, например

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting
        return;
    }

    switch ($errno) {
    case E_USER_ERROR:
        $str = "<b>My ERROR</b> [$errno] $errstr<br />\n" .
               "  Fatal error on line $errline in file $errfile" .
               ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n" .
               "Aborting...<br />\n";
        syslog(LOG_CRIT, $errstr)
        exit(1);
        break;
    case E_USER_WARNING:
        // ...
}

Также неплохо было бы сделать то же самое с set_exception_handler. .

person quickshiftin    schedule 07.05.2013

Я заметил этот пост в журналах рефералов в моем блоге, на который вы ссылаетесь. Проблема с системным журналом заключается в том, что у вас нет никаких гарантий, что ваше сообщение действительно будет доставлено в хранилище журналов. Конечно, PHP можно исправить, чтобы он выдавал вам сообщение об ошибке, но если вам нужны журналы транзакций, вам гораздо лучше хранить их непосредственно в базе данных.

Если вы настаиваете на этом, вот библиотека Я участвовал в разработке, которая заменит родной интерфейс системного журнала PHP. Он полностью написан на PHP, поэтому вам не нужно ничего компилировать.

Надеюсь, это поможет.

person Janos Pasztor    schedule 10.05.2013