Пользовательские (динамические) имена файлов журналов с laravel5.6 - PullRequest
0 голосов
/ 12 мая 2018

С laravel 5.5 у нас был доступ к методу configureMonologUsing() в $ app, который позволял делать такие вещи в bootstrap / app.php:

$app->configureMonologUsing(function (Monolog\Logger $monolog) {
    $processUser = posix_getpwuid(posix_geteuid());
    $processName= $processUser['name'];

    $filename = storage_path('logs/laravel-' . php_sapi_name() . '-' . $processName . '.log');
    $handler = new Monolog\Handler\RotatingFileHandler($filename);
    $monolog->pushHandler($handler);
});

Это полезно, когда ваше приложение может вызываться из разных контекстов (например, CLI / HTTP) с разными пользователями (что желательно) и ротацией файлов. Это предотвращает ошибки записи в случае, если файл журнала был создан пользователем HTTP до того, как пользователь CLI попытается что-то добавить в него, и наоборот.

Обработка этого в противном случае сложна или небезопасна, так как требует установки разрешений на запись для файлов, которые могут еще не существовать.

Кроме того, очень удобно иметь журналы, разделенные контекстами, поскольку они обычно имеют мало общего, и это облегчает поиск среди них.

К сожалению, с laravel 5.6 такой способ работы больше невозможен, и я (пока) не мог найти способ сделать это прозрачно для всех файловых журналов.

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Решение:

step1: создать канал внутри файла config / logging.php

пример:

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

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

]

Step2: Теперь установите путь dyanamic от контроллера следующим образом:

config(['logging.channels.web.path' => storage_path('logs/web/'.time().'.log')]);

Шаг 3: теперь создайте свой журнал

  Log::channel('web')->info("your message goes here");

Наслаждайтесь:)

0 голосов
/ 21 мая 2018

Настройка теперь выполняется путем вызова пользовательского форматера для Monolog.

Вот пример использования ежедневных вращающихся имен файлов (как я).

Это может быть установлено в config/logging.php, обратите внимание на нестандартный параметр tap:

'channels' => [

    'daily' => [
        'driver' => 'daily',
        'tap' => [App\Logging\CustomFilenames::class],
        'path' => storage_path('logs/laravel.log'),
        'level' => 'debug',
    ],

]

В своем пользовательском редакторе вы можете манипулировать регистратором Monolog так, как вам нравится, подобно configureMonologUsing():

app\Logging\CustomFilenames.php

<?php

namespace App\Logging;

use Monolog\Handler\RotatingFileHandler;

class CustomFilenames
{
    /**
     * Customize the given logger instance.
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            if ($handler instanceof RotatingFileHandler) {
                $sapi = php_sapi_name();
                $handler->setFilenameFormat("{filename}-$sapi-{date}", 'Y-m-d');
            }
        }
    }
}

Один из способов восстановить исходное поведение - удалить компонент {date} из filenameFormat обработчика. Лучшим способом может быть манипулирование соответствующим обработчиком для драйвера single.

См .: https://laravel.com/docs/5.6/logging#advanced-monolog-channel-customization

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...