首页 文章

Laravel 5.3更改特定控制台命令的日志文件

提问于
浏览
2

我的Laravel 5.3应用程序中有两个嘈杂的控制台命令,我想保留日志,但是希望让它们从系统的其余部分写入不同的日志文件 .

目前我的应用程序使用 $app->configureMonologUsing(function($monolog) { ... 将日志写入 bootstrap/app.php 中配置的文件

二等奖是将所有控制台命令写入另一个日志文件,但理想情况下只是这两个 .

我尝试按照这些说明(https://blog.muya.co.ke/configure-custom-logging-in-laravel-5/https://laracasts.com/discuss/channels/general-discussion/advance-logging-with-laravel-and-monolog)将所有控制台日志重新路由到另一个文件,但它不起作用,只是在其余代码中引起了奇怪的问题 .

如果这仍然是5.3中的首选方法,那么我将继续尝试,但想知道是否有更新的方法或方法只更改这两个控制台命令的文件 .

2 回答

  • 0

    他们是你可以采取的两种方法

    首先,您可以使用 Log::useFilesLog::useDailyFiles ,如建议here .

    Log::useDailyFiles(storage_path().'/logs/name-of-log.log'); 
    Log::info([info to log]);
    

    这种方法的缺点是所有内容仍然会记录在您的默认日志文件中,因为默认的Monolog是在您的代码之前执行的 .

    其次,为了避免在默认日志中包含所有内容,您可以覆盖默认日志记录类 . 一个例子是here . 您可以拥有一个特定的日志文件,例如 Log::info() ,所有其他日志都可以写入您的默认文件中 . 这种方法的明显缺点是它需要更多的工作和代码维护 .

  • 0

    这是可能的,但首先您需要删除现有的处理程序 .

    Monolog已经设置了一些日志处理程序,所以你需要摆脱那些 $monolog->popHandler(); . 然后使用Wistar's建议添加新日志的简单方法是使用 $log->useFiles('/var/log/nginx/ds.console.log', $level='info'); .

    public function fire (Writer $log)
    {
        $monolog = $log->getMonolog();
        $monolog->popHandler();
    
        $log->useFiles('/var/log/nginx/ds.console.log', $level='info');
        $log->useFiles('/var/log/nginx/ds.console.log', $level='error');
        ...
    

    适用于多个处理程序

    如果您设置了多个日志处理程序(例如,如果您使用的是Sentry),则可能需要在清除处理程序之前弹出多个日志处理程序 . 如果你想保留一个处理程序,你需要遍历所有这些,然后读取你想要保留的处理程序 .

    如果你试图弹出一个不存在的处理程序,那么 $monolog->popHandler() 将抛出异常,因此你必须jump through hoops才能使它运行 .

    public function fire (Writer $log)
    {
        $monolog = $log->getMonolog();
    
        $handlers = $monolog->getHandlers();
        $numberOfHandlers = count($handlers);
        $saveHandlers = [];
    
        for ($idx=0; $idx<$numberOfHandlers; $idx++)
        {
            $handler = $monolog->popHandler();
    
            if (get_class($handler) !== 'Monolog\Handler\StreamHandler')
            {
                $saveHandlers[] = $handler;
            }
        }
    
        foreach ($saveHandlers as $handler)
        {
            $monolog->pushHandler($handler);
        }
    
        $log->useFiles('/var/log/nginx/ds.console.log', $level='info');
        $log->useFiles('/var/log/nginx/ds.console.log', $level='error');
        ...
    

    要更好地控制日志文件,而不是 $log->useFiles() ,您可以使用以下内容:

    $logStreamHandler = new \Monolog\Handler\StreamHandler('/var/log/nginx/ds.console.log');
    
    $pid = getmypid();
    
    $logFormat = "%datetime% $pid [%level_name%]: %message%\n";
    $formatter = new \Monolog\Formatter\LineFormatter($logFormat, null, true);
    $logStreamHandler->setFormatter($formatter);
    
    $monolog->pushHandler($logStreamHandler);
    

相关问题