使用 Laravel 在生产中禁用 Log::info

Disable Log::info in production using Laravel

我假设默认情况下 Log::info 调用不会登录生产,但它们仍在进来。

我正在使用我的 .env 文件设置生产环境

APP_ENV=production
APP_DEBUG=false

我也尝试过这些命令,但没有成功

composer dump-autoload
php artisan cache:clear
php artisan optimize

我是不是漏掉了什么?

当您的应用程序未处于调试模式时,只会抑制错误的显示。 Log::info() 函数将在调用时始终记录。

简单的解决方案是将 Log::info() 函数包装成这样:

if (App::environment('local', 'staging')) {
    Log::info($error);
}

请务必在文件顶部包含 App facade use App;。或者,您可以使用 app() 助手来获取环境:$environment = app()->environment();

好吧,我认为搜索所有 Log::info() 并按照@jon__o

做建议的答案为时已晚
if (App::environment('local', 'staging')) {
    Log::info($error);
}

不过你还是可以做点什么的。您可以使用自己的实现覆盖默认的 Laravel 记录器实例。

转到您的 ApplicationServiceProvider 并用自定义实例覆盖 log 实例:

/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    $this->registerLogger();
}

/**
 * Register the logger instance in the container.
 *
 * @return MyCustomWriter
 */
protected function registerLogger()
{
    $this->app->instance('log', $log = new MyCustomWriter(
        new Monolog($this->app->environment()), $app['events'])
    );

    $log->dontLogInfoOnEnvironmnets(['production', 'staging', 'other']);
    return $log;
}

现在您只需扩展 Laravel 的 Writer 并覆盖 info() 方法即可创建自定义编写器。

class MyCustomWriter extends \Illuminate\Log\Writer
{

    protected $dontInfoOn = [];

    /**
     * Log an informational message to the logs.
     *
     * @param  string  $message
     * @param  array  $context
     * @return void
     */
    public function info($message, array $context = [])
    {
        // Since we are providing the app environment to the Monolog instance in out ApplicationServiceProvider
        // we can get the environment from the Monolog getName() method
        if(!in_array($this->monolog->getName(), $this->dontInfoOn)) {
            return parent::info($message, $context);
        }
    }

    /**
     * Don't log info() on the supplied environments .
     *
     * @param  array  $environments
     * @return void
     */
    public function dontLogInfoOnEnvironmnets(array $environments)
    {
        $this->dontInfoOn = $environments;
    }
}

这样,您仍然可以 Log::info 在测试环境中,而无需每次都检查。

对于仍然能找到这个主题的人(8 年后):

在 config/logging.php 文件中配置您的日志通道

将日志通道的 "level" 参数设置为 .env 变量

示例:

  'channels' => [
    'slack' => [
      'driver' => 'slack',
      'url' => env('LOG_SLACK_WEBHOOK_URL'),
      'username' => 'Lumen Log',
      'emoji' => ':boom:',
      'level' => env('LOG_LEVEL', 'error'),
    ]
  ]

现在您可以在 .env 文件中为每个环境设置 LOG_LEVEL 变量