как настроить имя файла журнала в Laravel 8.0?

#php #laravel #logging #laravel-8

#php #laravel #ведение журнала #laravel-8

Вопрос:

я искал решение для пользовательского имени файла журнала. я получил решение, которое работало в проекте версии 5.6. но после того, как это означает больше, чем 5.6, он не работает. я стараюсь использовать много решений, но они не работают. каждый раз, когда имя файла генерирует laravel.log. но я хочу получить его как laravel-{vendor_code}-{date}.log

я использовал решение, код которого приведен ниже.

CustomLogFile.php

 <?php

    namespace AppLogging;
    
    use IlluminateHttpRequest;
    use MonologHandlerRotatingFileHandler;
    
    class CustomLogFile
    {
        /**
         * Customize the given logger instance.
         *
         * @param  IlluminateLogLogger  $logger
         * @return void
         */
        public function __invoke($logger )
        {
            $code = 'NA';
            $headers = apache_request_headers();
            if( isset( $headers['DBAuth'] ))
            {
                $code =  dnc($headers['DBAuth']) ;
            }
            elseif ( isset($_REQUEST['code']) )
            {
                $code = $_REQUEST['code'];
            }
    
            foreach ($logger->getHandlers() as $handler) {
                if ($handler instanceof RotatingFileHandler) {
                    $sapi = php_sapi_name();
                    $handler->setFilenameFormat("{filename}-$code-{date}", 'Y-m-d');
                }
            }
        }
    }
  

Конфигурация / logging.php

 'default' => env('LOG_CHANNEL', 'stack'),
   ......

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily'],
            'ignore_exceptions' => false,
        ],

        'single' => [
            'driver' => 'single',         
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],

        'daily' => [
            'driver' => 'daily',
            'tap' => [AppLoggingCustomLogFile::class],
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 14,
        ],
  

здесь этот код работает как мое условие в 5.6 v Laravel, но не более 5.6 V.

я пытаюсь проверить $logger-> getHandlers() . тогда я получаю, что поток массива равен нулю. так может ли это быть причиной этого.

Ответ №1:

Вот рабочее решение для Laravel 8:

CustomLogFile.php

 
class CustomLogFile
{

    public function __invoke(array $config): Logger
    {
        $log = new Logger($config['logname']);
        $level = $log::toMonologLevel($config['level'] ?: 'debug');

        $vendor_code = $_REQUEST['code'] ?? 'NA';
        $date = Carbon::now()->toDateString();

        $logPath = storage_path("logs/$vendor_code-$date.log");
        $log->pushHandler(new StreamHandler($logPath, $level, false));

        return $log;
    }
}
  

Config/logging.php

 'channels' => [
//...
        'by_vendor_code' => [
            'driver' => 'custom',
            'via' => UserLogger::class,
            'logname' => 'by_vendor_code',
            'level' => 'debug',
        ],
//...
    ],
  

Пример использования из любого места:

 logs('by_vendor_code')->info('this vendor want to: ', ['context' => 'some context data']);
  

Ответ №2:

может быть, его ответ будет таким в файле env

 LOG_CHANNEL=daily
LOG_LEVEL=debug
  

Также измените настройку дня в Config/logging.php

 'daily' => [
            'driver' => 'daily',
            'tap' => [AppLoggingCustomLogFile::class],
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 1,  // 14----> 1
  

потому что в версии 6.2 я получал этот результат. итак, ответ здесь я скоро подтвержду с версией 8. *.