2016-11-21 68 views
3

在我想保留日志的Laravel 5.3应用程序中有两个令人讨厌的控制台命令,但宁愿让它们从系统其余部分写入不同的日志文件。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中的首选方法,那么我会继续尝试,但想知道是否有更新的方法或方法来更改这两个控制台命令的文件。

+1

我从来没有尝试过,但你觉得这个'登录:: useFiles($路径, $级别)'可以帮助吗?请参阅:https://laravel.com/api/5.3/Illuminate/Log/Writer.html#method_useFiles – Wistar

+0

@Wistar感谢您的建议,但这似乎没有什么区别。 –

+0

其他(请参阅:http://stackoverflow.com/questions/32552450/laravel-how-to-log-info-to-separate-file)有报告使用此方法。你有没有尝试第二个答案中的建议? 'Log :: useDailyFiles(storage_path()。'/ logs/name-of-log.log');' 'Log :: info([info to log]);' – Wistar

回答

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); 
0

它们是两种方法,你可以采取

首先,你可以使用Log::useFilesLog::useDailyFiles喜欢暗示here

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

这种方法的缺点是,因为默认的独白是你的代码之前执行的一切仍然会记录在默认的日志文件。

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