我感觉到日志递归问题,我想只为一次操作禁用日志。 Laravel日志是否有任何类型的运行时切换?像:
<?php
Log::stop();
// bypass log here
Log::resume();
不幸的是,没有办法通过外观像上面的例子那样做。什么是暂时关闭Laravel注册的最佳方式?
答案 0 :(得分:3)
这是一种愚蠢的方法。使用模拟交换Facade实例。
使用Mockery:
$app = Log::getFacadeRoot();
Log::shouldReceive('error', 'warning', 'debug', 'info', 'notice', 'critical', 'alert', 'emergency');
// bypass log here
Log::swap($app);
没有Mockery:
class LogMock {
public function __call($name, $arguments) {}
}
$app = Log::getFacadeRoot();
Log::swap(new LogMock);
// bypass log here
Log::swap($app);
答案 1 :(得分:0)
如果您要注册自定义侦听器,另一种可能的(不太通用的)解决方案是使用Config
facade来存储状态并绕过给定的回调:
<?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);
});