我遇到了一个日志递归问题,我只想为单个操作禁用日志。Laravel 日志是否有任何类型的运行时开关?像:
<?php
Log::stop();
// bypass log here
Log::resume();
不幸的是,没有办法像上面的例子那样通过外观来做到这一点。暂时关闭 Laravel 日志的最佳方法是什么?
这是一个 hacky 方法。用模拟交换外观实例。
嘲讽:_
$app = Log::getFacadeRoot();
Log::shouldReceive('error', 'warning', 'debug', 'info', 'notice', 'critical', 'alert', 'emergency');
// bypass log here
Log::swap($app);
没有嘲讽:
class LogMock {
public function __call($name, $arguments) {}
}
$app = Log::getFacadeRoot();
Log::swap(new LogMock);
// bypass log here
Log::swap($app);
如果您正在注册自定义侦听器,另一种可能的(不太通用的)解决方案是使用Config
外观来存储状态并绕过给定的回调:
<?php
Event::listen('illuminate.query', function($query, $bindings, $time, $name){
if(Config::get('log.enabled', true)){
Log::info($query, ['context' => ['bindings' => $bindings]]);
}
});
Log::listen(function($level, $message, $context) {
Config::set('log.enabled', false);
// do something bypassing listener who expects log.enabled
Config::set('log.enabled', true);
});