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 почти уверен, есть умное решение и я просто не хватает что-то. Любой предполагает? Спасибо!
Вы могли наследовать менеджер журнала, чтобы позволить конфигурацию динамического
<?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';