Лісозаготівля
Вступ
Щоб допомогти вам дізнатись більше про те, що відбувається у вашій програмі, 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
метод наLog
Facade для отримання та входу в будь-який канал, визначений у вашому файлі конфігурації:
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\Logger
instance проксіє всі виклики методів до базового екземпляра 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(...);
}
}