【问题标题】:How to Customize Log Format in Laravel?如何在 Laravel 中自定义日志格式?
【发布时间】:2019-06-08 00:29:11
【问题描述】:

如何覆盖 Laravel/Monolog 格式化异常的方式?

现在他们是这样出来的:

Next exception 'Illuminate\Database\QueryException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'pay.booking_id' in 'where clause' (SQL: select `seg`.`id` as `segment_id`, ..*snip*.. in /srv/myproject/vendor/laravel/framework/src/Illuminate/Database/Connection.php:729
Stack trace:
#0 /srv/myproject/vendor/laravel/framework/src/Illuminate/Database/Connection.php(685): Illuminate\Database\Connection->runQueryCallback('select `seg`.`i...', Array, Object(Closure))
#1 /srv/myproject/vendor/laravel/framework/src/Illuminate/Database/Connection.php(349): Illuminate\Database\Connection->run('select `seg`.`i...', Array, Object(Closure))
#2 /srv/myproject/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(1610): Illuminate\Database\Connection->select('select `seg`.`i...', Array, true)
#3 /srv/myproject/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(1596): Illuminate\Database\Query\Builder->runSelect()

我想自己获取 Exception 对象并对其进行格式化(返回一个字符串)。我不想覆盖/重新实现日志的去向(什么文件)或任何类似性质的东西。

使用 Laravel 5.2。

【问题讨论】:

  • 检查thisthis 的答案。您可以尝试在异常处理程序中覆盖其中一个methods。只需在父方法执行之前检查 $exception instanceof \Illuminate\Database\QueryException 是否。
  • 类似的建议在docs
  • @Tpojka 这些都没有回答我的问题。是的,我可以捕获异常并用它做一些不同的事情,但这就是为什么我特别声明我不想处理文件处理,只是处理消息的格式。魔法隐藏在parent::report 中,它使用$log,我假设它是Monolog 的一个实例。但我不想覆盖整个 Monolog 对象,只是格式化程序。

标签: php laravel laravel-5.2 monolog


【解决方案1】:

我不确定这是否是您要查找的内容,但您可以扩展 LogManager 类并将 Formatter 替换为您自己的。

我新建了一个LogManager,如下:

<?php

namespace App\Support\Log;

use Illuminate\Log\LogManager as BaseLogManager;
use Monolog\Formatter\LineFormatter;

class LogManager extends BaseLogManager
{
    protected function formatter()
    {
        $format = "%channel%.%level_name%: %message% %context% %extra% [%datetime%]\n";

        return tap(new LineFormatter($format, null, true, true), function ($formatter) {
            $formatter->includeStacktraces();
        });
    }
}

.. 它扩展了 Laravel 的基本日志管理器,但覆盖了 formatter()

您还会注意到消息的格式发生了变化,日期被附加到字符串的最后一部分。

剩下要做的就是将它绑定到容器中,而不是默认的。所以,在我的AppServiceProvider@register() 中,我添加了这个:

use App\Support\Log\LogManager;

$this->app->singleton('log', function () {
    return new LogManager($this->app);
});

..果然,新的日志格式是这样的:

local.INFO: test   [2019-01-14 04:42:07]

您还可以查看LineFormatter class,看看您还可以用它做些什么。

这就是你要找的吗?

【讨论】:

  • 关闭。是否可以仅替换 LineFormatter 而无需扩展整个 LogManager
  • 我认为如果 LogManager 类由 Formatter 组成,那可能是可能的,但由于它被实例化到 formatter() 方法中,我不完全确定是否会有一种简单的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 2019-04-04
  • 1970-01-01
  • 2019-10-29
  • 2014-08-13
  • 2016-04-23
  • 2020-04-12
相关资源
最近更新 更多