Как вывести информацию об исключении в файл журнала с 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'));