使用 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 变量
我假设默认情况下 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 变量