Laravel: Логирование в приложении

Источник: «Logging in Laravel»
Чтобы помочь вам узнать больше что происходит в вашем приложении, Laravel предоставляет надёжные службы логирования. Логирование в Laravel основано на каналах. Каждый канал представляет определённый способ записи информации в лог.

Когда нужно логирование

При разработке приложения вы, скорее всего, захотите понять, что на самом деле делает ваш код. Когда вы пишете код, не всегда возможно понять, каков будет результат, не тестируя его или не записывая вывод в определённое место. При диспетчеризации и обработке заданий в очереди в фоновом режиме, с использованием запланированных команд (cronjob) и других методов потребность в регистрации того, что делает код, будет выше, чем при работе с довольно простым приложением.

Как работает логирование в Laravel

Laravel, под капотом, использует пакет Monolog для всех своих возможностей логирования. Это решения логирования в PHP гибкое и с большими возможностями, и Laravel очень хорошо интегрировал его в свою структуру.

Использую комплексную конфигурацию для логирования, вы можете комбинировать несколько потоков записи в лог в Laravel. Это упрощает вывод в разные места и делает возможность логирования очень гибкими.

Laravel делает это возможным, используя терминологию каналов. Каналы предназначены для обеспечения нескольких типов выводов логов, из коробки, и используя драйвер stack вы можете настроить несколько каналов одновременно. Таким образом, ваше приложение может писать логи в несколько мест одновременно.

Конфигурация

Конфигурация по умолчанию — отличный пример того, как это работает. Здесь определены три разных канала: syslog (системный журнал), slack (резервный канал) и драйверstack. Где последний драйвер особенный, потому что может объединять несколько каналов (в данном случае syslog и slack вместе):

'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['syslog', 'slack'],
],

'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],

'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
],

Расширяемость

Всё возможно для логирования вашего Laravel приложения. Вы можете легко написать собственный драйвер записи логов.

Если вы хотите задать полностью настраиваемый канал, в котором у вас есть полный контроль над созданием и конфигурацией Monolog, вы можете указать тип драйвера custom в файле конфигурации config/logging.php. Ваша конфигурация должна включать опцию via, содержащую имя фабричного класса, который будет вызываться для создания экземпляра Monolog:

'channels' => [
'example-custom-channel' => [
'driver' => 'custom',
'via' => App\Logging\CreateCustomLogger::class,
],
],

После того как вы настроили канал драйвера custom, вы готовы определить класс, который создаст ваш экземпляр Monolog. Этому классу нужен только один метод __invoke, который должен возвращать экземпляр регистратора Monolog. В качестве единственного аргумента метод получит массив конфигурации каналов:

<?php

namespace App\Logging;

use Monolog\Logger;

class CreateCustomLogger
{
/**
* Create a custom Monolog instance.
*
* @param array $config
* @return \Monolog\Logger
*/

public function __invoke(array $config)
{
return new Logger(/* ... */);
}
}

Запись состояния в лог

Когда вы хотите записать состояние в один или несколько каналов, вы можете использовать фасад Log или хэлпер logger() внутри вашего Laravel приложения. Это позволяет очень легко выводить любое сообщение в настроенные каналы логов.

use Illuminate\Support\Facades\Log;

Log::debug($message); // logger()->debug($message);

Использование различных уровней логирования

При записи в лог рекомендуется определить правильный уровень, для которого предназначено сообщение. Например, может быть удобным использовать info только в информационных целях для слежения за ходом выполнения вашего кода. Но если вы хотите записывать в лог критические ошибки, то лучше воспользоваться методом critical(). Вот методы и функции записи сообщений в лог для разных уровней, доступные в Laravel:

use Illuminate\Support\Facades\Log;

Log::emergency($message); // logger()->emergency($message);
Log::alert($message); // logger()->alert($message);
Log::critical($message); // logger()->critical($message);
Log::error($message); // logger()->error($message);
Log::warning($message); // logger()->warning($message);
Log::notice($message); // logger()->notice($message);
Log::info($message); // logger()->info($message);
Log::debug($message); // logger()->debug($message);

Дополнительные материалы

Предыдущая Статья

Laravel: Использование DTO для сохранения контекста

Следующая Статья

Laravel: Как работает cron и планировщик задач