Как настроить формат журнала в Laravel? - PullRequest
0 голосов
/ 14 января 2019

Как мне переопределить, как 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 голосов
/ 14 января 2019

Я не уверен, что это то, что вы ищете, но вы могли бы расширить класс 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 и посмотреть, что еще можно с ним сделать.

Это то, что вы ищете?

...