首页 文章

如何在不禁用默认处理程序的情况下向Laravel添加新的异常处理程序?

提问于
浏览
3

我正在使用Sentry来跟踪Laravel应用程序中的异常 .

Sentry的文档说我应该在我的应用程序引导程序中使用以下代码来设置客户端:

$app->configureMonologUsing(function($monolog) {
    $client = new Raven_Client('your dsn');
    $handler = new Monolog\Handler\RavenHandler($client);
    $handler->setFormatter(new Monolog\Formatter\LineFormatter("%message% %context% %extra%\n"));
    $monolog->pushHandler($handler);
});

这很好!

副作用是Laravel的默认异常处理程序(在 /storage/logs/laravel.log 处将异常写入文件)在添加新的异常处理程序后停止工作 .

我怎样才能保留两个处理程序?

UPDATE for Laravel 5.6+

从Laravel 5.6开始,可以使用日志堆栈 . 它现在允许开发人员轻松设置多个日志通道 . 有关详细信息,请参阅the docs .

1 回答

  • 2

    您可以查看 Illuminate\Foundation\Bootstrap\ConfigureLogging 以了解Laravel如何设置其本机日志记录 . 然后在你自己的引导程序中,只需按下另一个执行相同操作的处理程序:

    $app->configureMonologUsing(function($monolog) {
    
        // Keep your existing Sentry configuration
        $client = new Raven_Client('your dsn');
        $handler = new Monolog\Handler\RavenHandler($client);
        $handler->setFormatter(new Monolog\Formatter\LineFormatter("%message% %context% %extra%\n"));
        $monolog->pushHandler($handler);
    
        // Add another handler that writes to laravel.log
        $handler = new Monolog\Handler\StreamHandler(storage_path('logs/laravel.log'));
        $handler->setFormatter(new Monolog\Formatter\LineFormatter(null, null, true, true));
        $monolog->pushHandler($handler);
    
    });
    

    Edit:

    如果您完全不了解_449292的行为,则可以使用默认格式化程序进行单行添加:

    $monolog->pushHandler(new Monolog\Handler\StreamHandler(storage_path('logs/laravel.log')));
    

    这与原生Laravel实现的不同之处在于它将default constructor arguments用于 LineFormatter 而不是之前明确设置的那些 .

    重用Laravel逻辑来配置Monolog的第三个选项是添加此行:

    with(new Illuminate\Log\Writer($monolog))->useFiles(storage_path('logs/laravel.log'));
    

相关问题