使用laravel5.6自定义(动态)日志文件名

时间:2018-05-12 10:21:48

标签: php laravel-5.6

使用laravel 5.5,我们可以访问$ app中的configureMonologUsing()方法,这样就可以在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 :(得分:8)

现在通过为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

答案 1 :(得分:0)

解决方案:

第一步:在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:现在像这样设置来自控制器的动态路径

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

Step3:现在生成您的日志

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

享受:)