Подтвердить что ты не робот

Запись полной статистики стека с помощью Monolog

Я использую Monolog в качестве автономной библиотеки в своем приложении, и недавно я столкнулся с проблемой. Скажем, в какой-то момент моего приложения я поймаю исключение, и я хочу его зарегистрировать:

$mylogger->error('Exception caught', array('exception' => $exception));

Это прекрасно работает, за исключением одной крошечной вещи - она ​​не регистрирует целую трассировку стека. Можно ли регистрировать полную статистику стека с помощью встроенных форматировщиков monolog?

4b9b3361

Ответ 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);