@torns
Пишу код в удовольсвие

Как сделать динамическое логирование в Laravel?

Добрый день, есть необходимость сделать динамическое логирование в хобби проекте.
Представим ситуацию, у нас множество пользователей и мы хотим логировать действия каждого из них в отдельных журналах. Я конечно нашел выход из ситуации, но вот думаю может можно как то и по другому сделать.
Как я реализовал это:
Объявил кастомный канал
config/logging.php
'custom' => [
      'driver' => 'custom',
      'via' => App\Logging\CreateCustomLogger::class,
],


2. Создал обработчик как в документации
app/logging/CreateCustomLogging.php
public function __invoke(array $config)
{
    return new Logger('name');
}


3. Добавил метод в интерфейс и сделал его реализацию
app/repositories/OfficeLogger.php
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
public function log(string $path, string $message, array $context)
{
     \Log::channel('custom')->pushHandler(new StreamHandler(storage_path($path), Logger::DEBUG))->info($message, $context);
}


А потом вызываю там где мне необходимо, вот так:
app('App\Repositories\Interfaces\OfficeLoggerInterface')->log('app/office-logger/1/47/.'.date('Y').'/'.date('d-m-Y').'.log', 'Hello world message', $context);


Наверное можно как то лучше сделать?
Нормально ли постоянно использовать app('interface')?
  • Вопрос задан
  • 1106 просмотров
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Что либо писать руками - это спагетти.
Суть ларавеля в том, что все делается автоматом

В данном случае делается middleware,

<?php

namespace App\Http\Middleware;

use Closure;
use \Illuminate\Http\Request;

class UserActivityLoggerMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        // тут пишешь свое логирование
       $user_id = $request->user()->id;
       $action = $request->route()->getName();
        // обяязательная строчка
        return $next($request);
    }
}

регистрируешь в Kernel.php
'logger' => \App\Http\Middleware\UserActivityLoggerMiddleware::class,


и рауты пользователей заключаешь в вызов этой мидлвари

Route::group(['middleware' => ['logger']], function()
{
}
Ответ написан
Alex_Wells
@Alex_Wells
PHP/Kotlin
Это реальная задача? И.е. нужно выводить эти действия куда-то, или это для дебага? Потому что если второе, то забудь о логировании через код. Есть логи nginx'а.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы