Laravel журнал путь 7 набор динамически в классе работы

966p:

Im строительный проект на Laravel 7.3 с несколькими заданиями, которые работают одновременно. Мне нужно, чтобы каждые из журналов работы записи в другой ежедневно повернутый файл. Имя файла журнала должен быть основан на модели, что Иов перерабатывает.

Этот вопрос я не могу найти умное решение.

То, что я пробовал:

1) создание нескольких каналов в config/logging.php.

Это работает как ожидалось, но на данный момент существует около 50 различных рабочих мест и количество продолжает расти. Метод некрасиво и вряд ли поддерживается.

2) создание Config(['logging.channels.CUSTOMCHANNEL.path' => storage_path('logs/platform/'.$this->platform->name.'.log')]);.

Мессинг с переменной Config была плохая идея, потому что из многих заданий, выполняющихся один раз. В результате сообщений из одного задания часто были написаны в другом журнале заданий.

3) с использованием Log::useDailyFiles()

Похоже , этого перестает работать , так как Laravel 5.5 или 5.6. Просто получаю сообщение об ошибке Call to undefined method Monolog\Logger::useDailyFiles(). Любые мысли , как сделать с работой в Laravel 7?

4) с использованием tapпараметра для канала в config/logging.php.

Пример в Laravel документации нет идей , как не передать название модели в CustomizeFormatter к имени файла установки.

Im почти уверен, есть умное решение и я просто не хватает что-то. Любой предполагает? Спасибо!

Shizzen83:

Вы могли наследовать менеджер журнала, чтобы позволить конфигурацию динамического

<?php

namespace App\Log;

use Illuminate\Support\Str;
use Illuminate\Log\LogManager as BaseLogManager;

class LogManager extends BaseLogManager
{
    /**
     * Get the log connection configuration.
     *
     * @param  string  $name
     * @return array
     */
    protected function configurationFor($name)
    {
        if (!Str::contains($name, ':')) {
            return parent::configurationFor($name);
        }
        [$baseName, $model] = explode(':', $name, 2);
        $baseConfig = parent::configurationFor($baseName);
        $baseConfig['path'] = ...; //your logic
        return $baseConfig;
    }
}

Точно так же о поставщик услуг журнала Laravel, за исключением этого можно полностью заменить

<?php

namespace App\Log;

use Illuminate\Support\ServiceProvider;

class LogServiceProvider extends ServiceProvider
{
    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('log', function ($app) {
            return new LogManager($app);
        });
    }
}

EDIT: Я только что видел , что поставщик услуг журнала Laravel является отсутствует config/app.php, это происходит потому , что это «трудно нагруженных» приложением. Вы все еще можете заменить его унаследовать само приложение

<?php

namespace App\Foundation;

use App\Log\LogServiceProvider;
use Illuminate\Events\EventServiceProvider;
use Illuminate\Routing\RoutingServiceProvider;
use Illuminate\Foundation\Application as BaseApplication;

class Application extends BaseApplication
{
    /**
     * Register all of the base service providers.
     *
     * @return void
     */
    protected function registerBaseServiceProviders()
    {
        $this->register(new EventServiceProvider($this));
        $this->register(new LogServiceProvider($this));
        $this->register(new RoutingServiceProvider($this));
    }
}

И , наконец , в bootstrap/app.php, заменить Illuminate\Foundation\ApplicationсApp\Foundation\Application

Например, если вы попытаетесь это сделать

app('log')->channel('single:users')->debug('test');

Laravel будет использовать в singleконфигурации канала и запись в users.logслучае ваше разрешение логика

$baseConfig['path'] = $model + '.log';

рекомендация

отhttp://10.200.1.11:23101/article/api/json?id=406801&siteId=1