Для отслеживания всех внутренних процессов работы приложения, Imhotep поддерживает службу логирования, которая умеет записывать сообщения в файлы, системный журнал или во внешние сервисы (например: Telegram).
Логирование основано на каналах. Каждый канал представляет определенный способ записи логов. Сообщения могут быть записаны в несколько каналов в зависимости от их важности.
Все параметры логирования приложения расположены в файле config/logging.php. В данном файле находятся настройки распространенных каналов логирования, изучите параметры каждого канала.
По умолчанию, Imhotep использует канал stack, который объединяет несколько каналов логирования в один.
По умолчанию, имя канала соответствует текущей среде production или local. Для изменения имени канала, добавьте параметр name в настройки канала:
'stack' => [
'driver' => 'stack',
'name' => 'channel-name',
'channels' => ['single','telegram'],
],
PHP, Imhotep и другие библиотеки часто уведомляют о том, что некоторые функции устарели и будут удалены в будущей версии. Для регистрации этих предупреждений, по умолчанию задан канал deprecations в конфигурационном файле приложения config/logging.php:
'deprecations' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
'channels' => [
// ...
'deprecations' => [
'driver' => 'single',
'path' => storage_path('logs/deprecations.log'),
],
// ...
]
Imhotep позволяет логировать сообщения с помощью фасада Log. Приложение обеспечивает восемь уровней ведения, определенных в спецификации RFC 5424 specification: emergency, alert, critical, error, warning, notice, info, и debug.
use Imhotep\Facades\Log;
Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);
Можно вызвать любой из этих методов, чтобы записать сообщение для соответствующего уровня. По умолчанию сообщение будет записано в канал по умолчанию, указанный в конфигурации logging:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Imhotep\Facades\Log;
class UserController extends Controller
{
public function show($id)
{
Log::info('Showing the user profile for user: '.$id);
// ...
}
}
Методам логирования может быть передан массив контекстных данных. Эти данные будут отображены в каждой записи лога:
Log::info('User failed to login.', ['id' => $id]);
Иногда может потребоваться указать дополнительную контекстную информацию, которая должна быть добавлена во все записи конкретного канала. Например, идентификатор запроса, связанный с каждым входящим запросом к приложению. Для этого используйте метод withContext фасада Log:
<?php
namespace App\Http\Middleware;
use Closure;
use Imhotep\Facades\Log;
use Imhotep\Support\Str;
class AssignRequestId
{
public function handle($request, Closure $next)
{
$requestId = Str::uuid();
// Добавление информации в канал по умолчанию
Log::withContext([
'request-id' => $requestId
]);
// Добавление информации в telegram канал
Log::channel('telegram')->withContext([
'request-id' => $requestId
]);
return $next($request)->header('Request-Id', $requestId);
}
}
Если необходимо добавить контекстную информацию во все созданные каналы и которые будут созданы позднее, используйте метод Log::shareContext. Данный метод предпочтительней вызывать из метода boot сервис-провайдера приложения:
use Imhotep\Facades\Log;
use Imhotep\Support\Str;
class AppServiceProvider
{
public function boot(): void
{
Log::shareContext([
'some-id' => Str::uuid(),
]);
}
}