Вы можете унаследовать диспетчер журналов, чтобы разрешить динамическую c конфигурацию
<?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);
});
}
}
РЕДАКТИРОВАТЬ: я только что видел, что 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
, если ваше разрешение logi c равно
$baseConfig['path'] = $model + '.log';