Запись полной статистики стека с помощью Monolog
Я использую Monolog в качестве автономной библиотеки в своем приложении, и недавно я столкнулся с проблемой. Скажем, в какой-то момент моего приложения я поймаю исключение, и я хочу его зарегистрировать:
$mylogger->error('Exception caught', array('exception' => $exception));
Это прекрасно работает, за исключением одной крошечной вещи - она не регистрирует целую трассировку стека. Можно ли регистрировать полную статистику стека с помощью встроенных форматировщиков monolog?
Ответы
Ответ 1
На самом деле, поскольку версия 1.12.0
, вы можете включить stacktrace в свой файл журнала: существует новый метод LineFormatter
, называемый includeStacktraces
.
Чтобы использовать это, вам нужно перезаписать поведение по умолчанию для монологического форматирования:
config.yml
monolog:
handlers:
main:
formatter: your.monolog.service.id
(rest of config is as usual)
services.yml
services:
your.monolog.service.id:
class: Monolog\Formatter\LineFormatter
calls:
- [includeStacktraces]
Проверить github для получения дополнительной информации:
Запрос Pull
Ответ 2
У меня очень простое решение!!!
$mylogger->error((string) $exception);
Ответ 3
Нет. Вы не можете регистрировать трассировку стека с помощью встроенных форматировщиков. См. Мой вопрос здесь.
Если вы посмотрите на LineFormatter.php
, вы увидите, что метод normalizeException
отвечает за захват данных исключений. Итак, мне пришлось создать новый форматтер, который расширил LineFormatter
. Здесь код:
<?php
namespace Monolog\Formatter;
use Exception;
class ExceptionLineFormatter extends LineFormatter
{
protected function normalizeException(Exception $e)
{
return 'Message: ' . $e->getMessage() .
'Stack Trace: '. $e->getTraceAsString();
}
}
И я инициализировал свой журнал таким образом:
$logFile = 'MyLogFile.txt';
$handler = new StreamHandler($logFile);
$handler->setFormatter(new ExceptionLineFormatter);
$log = new Logger('MyLogger');
$handler = self::getStreamHander();
$log->pushHandler($handler);
Это приведет к распечатке вашей трассировки стека.
Ответ 4
getTraceAsString предоставит вам массив Stack Trace в виде строки с разделителями "конец строки". Разверните на PHP_EOL, а затем выполните через массив, регистрирующий каждый элемент. Надеюсь, это поможет.
<?php
function test() {
throw new Exception;
}
try {
test();
} catch(Exception $e) {
$array = explode(PHP_EOL, $e->getTraceAsString());
foreach($array as $line){
$mylogger->error($line);
}
Должен выступить примерно так:
#0 index.php(14): test()
#1 {main}
Ответ 5
Вот как я это делаю, да лет спустя...
$mylogger->error('Exception caught', $exception->getTrace());
так как getTrace() возвращает массив, чего хочет Монолог.
Ответ 6
Добавляя к ответ Tomasz Madeyski, вы можете использовать его только с помощью кода:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\ErrorHandler;
use Monolog\Formatter\LineFormatter;
$formatter = new LineFormatter(LineFormatter::SIMPLE_FORMAT, LineFormatter::SIMPLE_DATE);
$formatter->includeStacktraces(true); // <--
$stream = new StreamHandler('error.log');
$stream->setFormatter($formatter);
$logger = new Logger('logger');
$logger->pushHandler($stream);