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

时间:2016-11-21 16:00:34

标签: php laravel logging laravel-5.3

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

目前,我的应用使用bootstrap/app.php

将日志写入$app->configureMonologUsing(function($monolog) { ...中配置的文件

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

我尝试按照这些说明(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 :(得分:0)

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

首先,您可以使用|------- |------- |------- | hostA | | hostB | | hostB | | ===== | | ===== | | ===== | | appA --------->appB---------->appC | |---↑---| | | ↑ | | | | appD------| | appE | | |---↓---| |-------| | | |--------------| * Whereas app? are circles bigger as more connections they have Log::useFiles之类的建议here

Log::useDailyFiles

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

其次,为了避免在默认日志中包含所有内容,您可以覆盖默认的日志记录类。给出了here的例子。您可以拥有一个特定的日志文件,让我们说Log::useDailyFiles(storage_path().'/logs/name-of-log.log'); Log::info([info to log]); ,其他所有日志都可以写在您的默认文件中。这种方法的明显缺点是它需要更多的工作和代码维护。

答案 1 :(得分: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);