Как вывести информацию об исключении в файл журнала с log4php?

Я настроил log4php для входа в файл с помощью приложения LoggerAppenderRollingFile и макета LoggerLayoutTTCC. Однако, когда я регистрирую исключение, оно не отображает детали исключения, такие как трассировка стека, как я привык видеть в log4net.

Я быстро просмотрел код и похоже, что LoggerAppenderMongoDB поддерживает отображение исключений с помощью formatThrowable метод, но я не вижу ничего подобного в других приложениях.

Я чувствую, что упускаю что-то очевидное. Есть ли что-то, что мне нужно настроить, чтобы распечатать эти данные в файл журнала? Нужно ли создавать собственный класс LoggerAppender? Или это может быть сделано с другим макетом или пользовательским средством визуализации?

3 ответа

К вашему сведению, теперь, когда LoggerLayoutTTCC устарела, вы можете использовать LoggerLayoutPattern с лучшей строкой формата для включения исключений.

<layout class="LoggerLayoutPattern">
   <param name="conversionPattern" value="%d{m/d/y H:i:s,u} [%t] %p %c %x - %m %newline%throwable" />
</layout>

<!-- %newline%throwable is the important part -->

См. Раздел "Исключения при ведении журнала" документов: http://logging.apache.org/log4php/docs/layouts/pattern.html

Вы должны использовать функцию PHP set_exception_handler и обернуть log4php с помощью этой функции. проверить это по адресу: http://php.net/manual/en/function.set-exception-handler.php

function exception_handler($exception) {

$ Лог-> отладки ($exception-> GetMessage ()); }

set_exception_handler ('exception_handler');

Я пришел к такому же выводу: похоже, что log4php только что-то делает с $throwable параметр в LoggerAppenderMongoDB.php Appender.

LoggerAppenderFile Базовый класс опирается на макет, LoggerLayoutTTCC, чтобы отформатировать сообщение (как и следовало ожидать). Этот класс имеет метод ignoresThrowable(), который возвращает истину. Хотя этот метод, по-видимому, не вызывается, он мягко сообщает, что авторы, похоже, не намеревались принимать к сведению ошибку.

Я добавил свой собственный класс макета, который расширяет LoggerLayoutTTCC и переопределяет формат ()

    class LoggerLayoutTTCCWithException extends LoggerLayoutTTCC
    {
        public function format(LoggerLoggingEvent $event) {
            $format = parent::format($event);

            $throwableInfo = $event->getThrowableInformation();
            if ($throwableInfo === null) {
                return $format;
            }

            $renderer = new LoggerRendererException();
            return $format . $renderer->render($throwableInfo->getThrowable());
        }
    }

Мне потребовалось время, чтобы выяснить, почему исходное имя файла и номер строки не были зарегистрированы log4php при возникновении исключения. Оказалось, что мой обычайexception_handler класс только регистрировал сообщение об исключении (выполняя $exception->getMessage()), который не содержит ни имени файла, ни номера строки. Все, что мне нужно сделать, это объединить эту информацию:$exception->getFile() а также $exception->getLine():

public function exception_handler ($exception) {
        $logger = Logger9::create();
        $logger->info($exception->getMessage()." ".$exception->getFile()." ".$exception->getLine());
}

Не забудьте зарегистрировать собственный обработчик:

@set_exception_handler(array($this, 'exception_handler'));
Другие вопросы по тегам