【问题标题】:How to add a new exception handler to Laravel without disable the default one?如何在不禁用默认异常处理程序的情况下向 Laravel 添加新的异常处理程序?
【发布时间】:2016-07-17 09:04:24
【问题描述】:

我使用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 的文件)在添加新的异常处理程序后停止工作。

如何保留两个处理程序?

Laravel 5.6+ 更新

从 Laravel 5.6 开始提供日志堆栈。它现在允许开发人员轻松设置多个日志通道。有关更多信息,请参阅the docs

【问题讨论】:

    标签: php laravel laravel-5 sentry


    【解决方案1】:

    您可以查看 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);
    
    });
    

    编辑:

    如果您不需要准确地重现 Laravel 的行为,则可以使用默认格式化程序进行单行添加:

    $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'));
    

    【讨论】:

    • 我在这里查看github.com/laravel/framework/blob/5.2/src/Illuminate/Foundation/…,但我没有看到StreamHandler 实例。
    • StreamHandler 是从 Monolog 包中导入的,源代码位于:github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/… ... 但您无需深入了解Illuminate\Log\Writer 即可重现 Laravel 行为。答案中的代码应该可以工作。
    • 我期待更简洁的东西。也许框架应该有办法保留默认记录器。但不是你的错,你的代码有效。谢谢!
    • 没有问题,我添加了几种替代方法来实现更简洁的相同结果,如果有帮助的话。就我个人而言,我会坚持原来的答案——虽然更冗长,但它避免了混合可能令人困惑的抽象级别。但没关系,只要最适合您的需求!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多