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

4
我原以为默认情况下Log::info调用不会在生产环境中记录日志,但它们仍在记录。

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

APP_ENV=production
APP_DEBUG=false

我也尝试了这些命令,但没有成功。
composer dump-autoload
php artisan cache:clear
php artisan optimize

我有什么遗漏吗?


我不认为日志记录与环境有关。无论是生产环境还是非生产环境,Laravel都会记录所有信息。 - Jilson Thomas
为什么你不想在生产环境中记录日志? - Roj Vroemen
为了加快任务速度,我只想报告 Log::error 日志。 - Parampal Pooni
3个回答

8

对于仍在寻找此线程(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 变量


4

我认为现在搜索所有的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,而无需每次都进行检查。

1
只有在应用程序不处于调试模式时,才会抑制错误的显示。当调用时,Log::info()函数将始终记录日志。
简单的解决方案是将Log::info()函数包装在类似以下内容的东西中:
if (App::environment('local', 'staging')) {
    Log::info($error);
}

请确保在文件顶部包含应用程序门面 use App;。或者,您可以使用 app() 助手获取环境:$environment = app()->environment();

1
我在很多地方都有Log::info语句,有没有一个地方可以集中处理? - Parampal Pooni
是的,你可以像@Blue Genie建议的那样扩展日志编写器。可能还有其他方法。如果你正在使用像Sublime这样的PHP编辑器,你可以在整个应用程序目录中查找和替换文件。我发布的这个答案是我的建议,因为在日常编码中充分利用环境是一个好习惯。 - jon__o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接