【问题标题】:Disable Log::info in production using Laravel使用 Laravel 在生产环境中禁用 Log::info
【发布时间】:2016-05-21 14:48:09
【问题描述】:

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

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

APP_ENV=production
APP_DEBUG=false

我也尝试过这些命令,但没有运气

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

我错过了什么吗?

【问题讨论】:

  • 我认为 Logging 与环境无关。无论是否生产,laravel 都会记录所有信息。
  • 为什么不想登录生产环境?
  • 为了加快任务,我只想报告 Log::error 日志。

标签: php laravel laravel-5.1 monolog


【解决方案1】:

对于仍在寻找此主题的任何人(8 年后):

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

将日志通道的“级别”参数设置为 .env 变量

例子:

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

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

【讨论】:

    【解决方案2】:

    好吧,我认为现在搜索所有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 留在测试环境中,而无需每次都检查。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 我到处都有 Log::info 语句,有没有一个地方我可以做到?
      • 是的,您可以像@Blue Genie 建议的那样扩展日志编写器。可能还有其他方法。如果您使用的是像 Sublime 这样的 PHP 编辑器,您可以在整个应用程序目录中的文件中查找和替换。我发布的这个答案是我的建议,因为在日常编码中利用环境来发挥自己的优势是一种很好的做法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 2021-06-26
      • 2011-03-02
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多