如何在Laravel中自定义日志格式?

时间:2019-01-14 00:07:58

标签: php laravel laravel-5.2 monolog

如何覆盖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。

1 个答案:

答案 0 :(得分:2)

我不确定这是否是您要寻找的,但是您可以扩展LogManager类,并用您自己的格式器替换。

我创建了一个新的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,并查看可以使用它进行哪些其他操作。

这是您要找的东西吗?