Версія фреймворка: 8.x

Лісозаготівля

Вступ

Щоб допомогти вам дізнатись більше про те, що відбувається у вашій програмі, Laravel надає надійні служби реєстрації, які дозволяють реєструвати повідомлення у файли, журнал системних помилок і навіть у Slack, щоб повідомити всю вашу команду.

Під капотом Laravel використовуєМонологбібліотека, яка забезпечує підтримку різноманітних потужних обробників журналів. Laravel робить зручним налаштування цих обробників, дозволяючи змішувати та поєднувати їх, щоб налаштувати обробку журналів програми.

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

Вся конфігурація системи реєстрації вашої програми розміщена вconfig/logging.phpфайл конфігурації. Цей файл дозволяє вам налаштувати канали журналу програми, тому перегляньте кожен з доступних каналів та їх варіанти. Нижче ми розглянемо кілька загальних варіантів.

За замовчуванням Laravel буде використовуватиstackканал при реєстрації повідомлень.stackКанал використовується для об'єднання кількох каналів журналу в один канал. Щоб отримати додаткову інформацію про будівельні стеки, перегляньтедокументація нижче.

Налаштування назви каналу

За замовчуванням у Monolog створюється екземпляр із "назвою каналу", яке відповідає поточному середовищу, наприкладproductionабоlocal. Щоб змінити це значення, додайте anameваріант конфігурації вашого каналу:

'stack' => [
    'driver' => 'stack',
    'name' => 'channel-name',
    'channels' => ['single', 'slack'],
],

Доступні драйвери каналів

Ім'я Опис
stack Обгортка для полегшення створення "багатоканальних" каналів
single Канал реєстратора на основі одного файлу або шляху (StreamHandler)
daily ARotatingFileHandlerдрайвер Monolog, який обертається щодня
slack ASlackWebhookHandlerдрайвер Monolog на базі
papertrail ASyslogUdpHandlerдрайвер Monolog на базі
syslog ASyslogHandlerдрайвер Monolog на базі
errorlog AErrorLogHandlerдрайвер Monolog на базі
monolog Заводський драйвер Monolog, який може використовувати будь-який підтримуваний обробник Monolog
custom Драйвер, який викликає вказану фабрику для створення каналу
Ознайомтеся з документацією нарозширена настройка каналущоб дізнатись більше проmonologіcustomводіїв.

Налаштування одинарного та щоденного каналів

singleіdailyканали мають три додаткові параметри конфігурації:bubble,permission, іlocking.

Ім'я Опис За замовчуванням
bubble Вказує, чи повинні повідомлення надходити на інші канали після обробки true
permission Дозволи файлу журналу 0644
locking Спроба заблокувати файл журналу перед записом до нього false

Налаштування каналу Papertrail

papertrailканал вимагаєurlіportпараметри конфігурації. Ви можете отримати ці значення зПапертрейл.

Налаштування каналу Slack

slackканал вимагає aurlваріант конфігурації. Ця URL-адреса повинна відповідати URL-адресі длявхідний вебхукякі ви налаштували для своєї команди Slack. За замовчуванням Slack отримуватиме журнали лише наcriticalрівень і вище; однак ви можете налаштувати це вloggingфайл конфігурації.

Будівництво Log Stacks

Як уже зазначалося,stackДрайвер дозволяє об'єднати кілька каналів в один журнал. Щоб проілюструвати, як використовувати стеки журналів, давайте розглянемо приклад конфігурації, який ви можете побачити у виробничому додатку:

'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',
    ],
],

Давайте розберемо цю конфігурацію. По-перше, зверніть увагу на нашstackканал агрегує два інших канали через свійchannelsваріант:syslogіslack. Отже, при реєстрації повідомлень обидва ці канали матимуть можливість реєструвати повідомлення.

Рівні журналу

Зверніть увагу наlevelпараметр конфігурації, присутній наsyslogіslackконфігурації каналів у прикладі вище. Цей параметр визначає мінімальний "рівень", яким повинно бути повідомлення, щоб канал міг реєструватися. Monolog, який надає послуги реєстрації Laravel, пропонує всі рівні журналу, визначені вСпецифікація RFC 5424:надзвичайна ситуація,попередження,критичний,помилка,увага,повідомлення,інформація, івідлагоджувати.

Отже, уявімо, що ми реєструємо повідомлення за допомогоюdebugметод:

Log::debug('An informational message.');

Враховуючи нашу конфігурацію,syslogканал запише повідомлення в системний журнал; однак, оскільки повідомлення про помилку немаєcriticalабо вище, він не буде надісланий Slack. Однак, якщо ми реєструємоemergencyповідомлення, воно буде надіслано як до системного журналу, так і до Slack, оскількиemergencyрівень перевищує наш мінімальний поріг рівня для обох каналів:

Log::emergency('The system is down!');

Написання журнальних повідомлень

Ви можете записувати інформацію до журналів, використовуючиLogфасад. Як зазначалося раніше, реєстратор забезпечує вісім рівнів реєстрації, визначених уСпецифікація RFC 5424:надзвичайна ситуація,попередження,критичний,помилка,увага,повідомлення,інформаціяівідлагоджувати:

Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);

Отже, ви можете зателефонувати будь-якому з цих методів, щоб записати повідомлення на відповідний рівень. За замовчуванням повідомлення буде записано на канал журналу за замовчуванням, як налаштовано вашимconfig/logging.phpфайл конфігурації:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Support\Facades\Log;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function showProfile($id)
    {
        Log::info('Showing user profile for user: '.$id);

        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

Контекстна інформація

Масив контекстних даних також може бути переданий методам журналу. Ці контекстуальні дані будуть відформатовані та відображені з повідомленням журналу:

Log::info('User failed to login.', ['id' => $user->id]);

Запис на певні канали

Іноді вам може знадобитися зареєструвати повідомлення на каналі, відмінному від стандартного для вашої програми. Ви можете використовуватиchannelметод наLogFacade для отримання та входу в будь-який канал, визначений у вашому файлі конфігурації:

Log::channel('slack')->info('Something happened!');

Якщо ви хочете створити стек реєстрації на вимогу, що складається з декількох каналів, ви можете використовуватиstackметод:

Log::stack(['single', 'slack'])->info('Something happened!');

Розширена настройка каналу Monolog

Налаштування Monolog для каналів

Іноді вам може знадобитися повний контроль над тим, як Monolog налаштовано на існуючий канал. Наприклад, ви можете налаштувати власний MonologFormatterInterfaceреалізація для обробників даного каналу.

Для початку визначте atapмасив конфігурації каналу.tapмасив повинен містити перелік класів, які повинні мати можливість налаштувати (або "зачепити") примірник Monolog після його створення:

'single' => [
    'driver' => 'single',
    'tap' => [App\Logging\CustomizeFormatter::class],
    'path' => storage_path('logs/laravel.log'),
    'level' => 'debug',
],

Після налаштуванняtapна вашому каналі, ви готові визначити клас, який буде налаштовувати ваш екземпляр Monolog. Цей клас потребує лише одного методу:__invoke, який отримуєIlluminate\Log\Loggerекземпляр.Illuminate\Log\Loggerinstance проксіє всі виклики методів до базового екземпляра Monolog:

<?php

namespace App\Logging;

use Monolog\Formatter\LineFormatter;

class CustomizeFormatter
{
    /**
     * Customize the given logger instance.
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $handler->setFormatter(new LineFormatter(
                '[%datetime%] %channel%.%level_name%: %message% %context% %extra%'
            ));
        }
    }
}
Усі ваші класи "натискання" вирішуютьсяслужбовий контейнер, тому будь-які залежності конструктора, які вони потребують, будуть автоматично введені.

Створення каналів обробки монологів

Monolog має різноманітнідоступні обробники. У деяких випадках тип реєстратора, який ви хочете створити, - це просто драйвер Monolog із екземпляром конкретного обробника. Ці канали можна створити за допомогоюmonologводій.

При використанніmonologводій,handlerПараметр конфігурації використовується, щоб вказати, який обробник буде створений. За бажанням, будь-які параметри конструктора, необхідні обробнику, можуть бути вказані за допомогоюwithваріант конфігурації:

'logentries' => [
    'driver'  => 'monolog',
    'handler' => Monolog\Handler\SyslogUdpHandler::class,
    'with' => [
        'host' => 'my.logentries.internal.datahubhost.company.com',
        'port' => '10000',
    ],
],

Monolog Formatters

При використанніmonologводій, MonologLineFormatterбуде використовуватися як форматтер за замовчуванням. Однак ви можете налаштувати тип форматування, що передається обробнику за допомогоюformatterіformatter_withпараметри конфігурації:

'browser' => [
    'driver' => 'monolog',
    'handler' => Monolog\Handler\BrowserConsoleHandler::class,
    'formatter' => Monolog\Formatter\HtmlFormatter::class,
    'formatter_with' => [
        'dateFormat' => 'Y-m-d',
    ],
],

Якщо ви використовуєте обробник Monolog, який може забезпечити власний програму форматування, ви можете встановити значенняformatterваріант конфігурації доdefault:

'newrelic' => [
    'driver' => 'monolog',
    'handler' => Monolog\Handler\NewRelicHandler::class,
    'formatter' => 'default',
],

Створення каналів на Factories

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

'channels' => [
    'custom' => [
        '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(...);
    }
}