Как добавить новый обработчик исключений в Laravel, не отключая обработчик по умолчанию?

Я использую 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 доступны стеки журналов. Теперь он позволяет разработчикам легко настраивать несколько каналов журналов. Дополнительные сведения см. в документах.


person Gustavo Straube    schedule 29.03.2016    source источник


Ответы (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 тем, что будет использовать аргументы конструктора по умолчанию для LineFormatter, а не те, которые мы явно устанавливали ранее.

Третьим вариантом, который повторно использует логику Laravel для настройки Monolog, будет добавление этой строки:

with(new Illuminate\Log\Writer($monolog))->useFiles(storage_path('logs/laravel.log'));
person Nick    schedule 29.03.2016
comment
Я смотрю здесь github.com/laravel /framework/blob/5.2/src/Illuminate/Foundation/, но я не вижу там экземпляра StreamHandler. - person Gustavo Straube; 29.03.2016
comment
StreamHandler импортируется из пакета Monolog, источник находится по адресу: github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/ ... но вам не нужно погружаться глубже, чем Illuminate\Log\Writer, чтобы воспроизвести поведение Laravel. Код в ответе должен работать. - person Nick; 29.03.2016
comment
Я ожидал чего-то более лаконичного. Возможно, у фреймворка должен быть способ сохранить регистратор по умолчанию. Но не твоя вина, твой код сработал. Благодарю вас! - person Gustavo Straube; 29.03.2016
comment
Нет проблем, я добавил несколько альтернативных способов достижения того же результата, которые являются более краткими, если это поможет. Лично я бы придерживался исходного ответа - хотя он и более подробный, он позволяет избежать смешивания уровней абстракции, которые могут сбивать с толку. Но это не имеет большого значения, все, что лучше всего соответствует вашим потребностям! - person Nick; 29.03.2016