使用Monolog记录完整堆栈跟踪

Wil*_*One 40 php monolog

我在我的应用程序中使用Monolog作为独立库,最近我遇到了一个问题.让我们说,在我的应用程序的某个时刻,我捕获一个异常,我想记录它:

$mylogger->error('Exception caught', array('exception' => $exception));
Run Code Online (Sandbox Code Playgroud)

除了一件小事之外,它的工作方式非常完美 - 它不记录整个堆栈跟踪.是否可以使用monolog内置格式化程序记录异常的完整堆栈跟踪?

Tom*_*ski 34

实际上,从版本开始1.12.0,可以在日志文件中包含stacktrace:有一种新的LineFormatter被调用方法includeStacktraces.

要使用它,您需要覆盖monolog格式化程序的默认行为:

config.yml

monolog:
    handlers:
        main:
            formatter: your.monolog.service.id
            (rest of config is as usual)
Run Code Online (Sandbox Code Playgroud)

services.yml

services:
    your.monolog.service.id:
        class: Monolog\Formatter\LineFormatter
        calls:
            - [includeStacktraces]
Run Code Online (Sandbox Code Playgroud)

检查github以获取更多信息: 请求


Ami*_*mir 16

我有一个非常简单的解决方案!

$mylogger->error((string) $exception);
Run Code Online (Sandbox Code Playgroud)

  • 您甚至可以省略(字符串)呼叫。至少如果您使用的是Monolog。 (2认同)

Ray*_*der 10

不,您无法使用内置格式化程序记录堆栈跟踪.在这里看我的问题.

如果您看一下,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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我像这样初始化了我的记录器:

$logFile = 'MyLogFile.txt';
$handler = new StreamHandler($logFile);
$handler->setFormatter(new ExceptionLineFormatter);
$log = new Logger('MyLogger');
$handler = self::getStreamHander();
$log->pushHandler($handler);
Run Code Online (Sandbox Code Playgroud)

这将打印出您的堆栈跟踪.

  • 这个答案已经过时了;-) (2认同)

kxo*_*kxo 10

您可以简单地使用带有“ include_stacktraces ”参数的配置文件(Symfony Bundle)

monolog:
    handlers:
        main:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.log"
            level: info
            channels: ["!event"]
            max_files: 10
            include_stacktraces: true <--- SET TO TRUE
Run Code Online (Sandbox Code Playgroud)

@看到 这个提交

@ 查看完整架构(配置)


Sei*_*Sys 8

添加到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);
Run Code Online (Sandbox Code Playgroud)