#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. *.