我的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中的首选方法,那么我会继续尝试,但想知道是否有更新的方法或方法只更改这两个控制台命令的文件。
答案 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);