【问题标题】:How to disable laravel logs temporarily?如何暂时禁用 laravel 日志?
【发布时间】:2014-10-10 23:28:56
【问题描述】:

我遇到了日志递归问题,我想只为单个操作禁用日志。 Laravel 日志有任何类型的运行时开关吗?喜欢:

<?php
Log::stop();
// bypass log here
Log::resume();

不幸的是,没有办法像上面的例子那样通过外观来做到这一点。暂时关闭 Laravel 日志的最佳方法是什么?

【问题讨论】:

  • 除非手动关闭,否则没有这种方法。
  • 暂时关闭它的最佳方法是什么?
  • 也许最好的办法是解决日志递归问题——为什么会出现递归失控?您是否使用循环引用记录某些内容并尝试解决它?如果是这样,也许最好的方法是覆盖 __toStringjsonSerialize(或其他)方法,以便在将循环引用转换为可记录的对象时不包含在对象中。
  • @alexrussell 我正在登录数据库,但正在记录来自日志侦听器函数的数据库调用...然后递归发生。

标签: logging laravel monolog


【解决方案1】:

这是一种很老套的方法。用模拟交换外观实例。

Mockery:

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

【讨论】:

  • 那太脏了。我喜欢它!实际上,使用Facade::swap 看起来很适合这个。没想到它的存在。
  • 我找到了另一种方法,但这确实是个好主意! :)
  • 我会将此标记为首选解决方案,因为它非常通用并且适用于所有人:)
【解决方案2】:

如果您要注册自定义侦听器,另一种可能(不太通用)的解决方案是使用 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);
});

【讨论】:

    猜你喜欢
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2013-10-26
    相关资源
    最近更新 更多