Как настроить middleware для регистрации журналов в Laravel?

Как можно изменить следующую стандартную запись:

Log::error($msg, $result);

чтобы в лог добавлялась информация о пользователе ($msg = $user . " " . $result) и чтобы запись отправлялась через POST-запрос в облако вместо записи в стандартный файл? При этом, с middleware я пока не знаком.
  • 17 октября 2023 г. 20:49
Ответы на вопрос 2
Для настройки middleware для регистрации журналов в Laravel следует выполнить следующие шаги:

1. Создайте новый middleware, используя команду Artisan:
```
php artisan make:middleware LogMiddleware
```

2. Откройте созданный файл в папке app/Http/Middleware/LogMiddleware.php и выполните необходимую настройку. В методе handle(), который будет вызываться при обработке каждого запроса, вы можете изменить доступный журнал Laravel для регистрации ваших собственных журналов и требуемую логику. Например:
```php
use Log;

public function handle($request, Closure $next)
{
    $user = $request->user(); // получение информации о текущем пользователе
    $result = // ваша логика

    // добавление информации о пользователе
    $msg = $user . " " . $result;
    
    // запись в журнал через Log
    Log::error($msg, $result);

    return $next($request);
}
```

3. Зарегистрируйте ваш middleware в файле app/Http/Kernel.php, добавив его класс в группу middleware 'web' или 'api', в зависимости от ваших потребностей:
```php
protected $middlewareGroups = [
    'web' => [
        // другие middleware
        \App\Http\Middleware\LogMiddleware::class,
    ],

    'api' => [
        // другие middleware
         \App\Http\Middleware\LogMiddleware::class,
    ],
];
```

4. Чтобы отправлять записи в журнал через POST-запрос в облако, вам необходимо изменить настройки журнала Laravel. Откройте файл config/logging.php и внесите следующие изменения:
```php
'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['cloud', 'single'],
    ],

    'cloud' => [
        'driver' => 'custom',
        'via' => App\Logging\CloudLogger::class,
    ],

    'single' => [
        'driver' => 'single',
        'path' => storage_path('logs/laravel.log'),
        'level' => 'debug',
    ],
],
```
Здесь мы создали канал "cloud" с драйвером "custom". Ваш класс для отправки журналов в облако может быть реализован вместо "App\Logging\CloudLogger::class" с использованием ваших собственных требований для облачных сервисов.

И последнее, создайте новый класс для отправки журналов в облако (например, app/Logging/CloudLogger.php):
```php
namespace App\Logging;

use Monolog\Logger;
use Monolog\Handler\Curl;
use Monolog\Handler\StreamHandler;

class CloudLogger
{
    public function __invoke(array $config)
    {
        // создание нового экземпляра Monolog Logger
        $logger = new Logger('cloud');

        // добавление обработчика для отправки журналов через POST-запрос в облако
        $logger->pushHandler(new Curl($config['url'], $config['method'], $config['headers']));

        // добавление обработчика для записи в стандартный файл лога, если требуется
        $logger->pushHandler(new StreamHandler($config['path'], Logger::DEBUG));

        return $logger;
    }
}
```
В данном примере мы используем Monolog для настройки логирования как через отправку POST-запроса в облако, так и через запись в стандартный файл лога.

Это основные шаги для настройки middleware для регистрации журналов в Laravel. Разумеется, вы можете настроить middleware под свои конкретные требования, и внести изменения в соответствии с вашими потребностями.
- Для добавления контекста логов в middleware можно использовать следующий пример кода:
  ```php
  class AssignRequestId
  {
      public function handle(Request $request, Closure $next): Response
      {
          $requestId = (string) Str::uuid();
  
          Log::withContext([
              'request-id' => $requestId
          ]);
  
          return $next($request)->header('Request-Id', $requestId);
      }
  }
  ```
  
- Однако, этот код добавляет информацию в контекст логов, а не в текст сообщения. Для модификации текста сообщения и создания новых каналов записи логов можно ознакомиться с соответствующей информацией, которая также приведена на той же странице документации.
Похожие вопросы