当前位置:首页 > CMS教程 > 其它CMS > 列表

自定义Laravel (monolog)日志位置,并增加请求ID的实现

发布:smiling 来源: PHP粉丝网  添加日期:2022-01-08 15:31:01 浏览: 评论:0 

今天小编就为大家分享一篇自定义Laravel (monolog)日志位置,并增加请求ID的实现,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。

修改 bootstrap/app.php 文件

  1. $app->configureMonologUsing(function($monolog) use ($app) { 
  2.  $monolog->pushHandler( 
  3.   (new Monolog\Handler\RotatingFileHandler( 
  4.    '/var/logs/app/laravel', 
  5.    $app->make('config')->get('app.log_max_files', 5) 
  6.   ))->setFormatter(new Monolog\Formatter\LineFormatter(null, null, true, true)) 
  7.  ); 
  8. }); 

添加以后写入日志文件为:

-rw-r--r-- 1 web web 93 Dec 18 15:52 laravel-2017-12-17

-rw-r--r-- 1 web web 279 Dec 18 16:10 laravel-2017-12-18

参考:Laravel 的错误和日志记录

或者

创建app\Providers\LogServiceProvider.php 文件

修改 config\app.php providers 增加

App\Providers\LogServiceProvider::class

然后 App\Providers\LogServiceProvider.php 内容如下

  1. <?php 
  2.  
  3. namespace App\Providers; 
  4.  
  5. use Illuminate\Log\LogServiceProvider as SysServiceProvider; 
  6. use Illuminate\Log\Writer; 
  7.  
  8. class LogServiceProvider extends SysServiceProvider 
  9. { 
  10.  protected function configureSingleHandler(Writer $log) 
  11.  { 
  12.   $log->useFiles( 
  13.    '/var/logs/app/laravel.log', 
  14.    $this->logLevel() 
  15.   ); 
  16.  } 
  17.  
  18.  protected function configureDailyHandler(Writer $log) 
  19.  { 
  20.   $log->useDailyFiles( 
  21.    '/var/logs/app/laravel.log', $this->maxFiles(), 
  22.    $this->logLevel() 
  23.   ); 
  24.  } 
  25. } 

增加请求ID request id

  1. namespace App\Providers; 
  2.  
  3. use Illuminate\Support\ServiceProvider; 
  4. use Carbon\Carbon; 
  5.  
  6. class LogServiceProvider extends ServiceProvider 
  7. { 
  8.  protected $log_file; 
  9.  
  10.  /** 
  11.   * Bootstrap any application services. 
  12.   * @return void 
  13.   */ 
  14.  public function boot() 
  15.  { 
  16.   // 
  17.  } 
  18.  
  19.  /** 
  20.   * Register any application services. 
  21.   * @return void 
  22.   */ 
  23.  public function register() 
  24.  { 
  25.   $this->load_request_id(); 
  26.  
  27.   $this->log_configure(); 
  28.  } 
  29.  
  30.  /** 
  31.   * 生成 request_id 
  32.   * @return void 
  33.   */ 
  34.  protected function load_request_id() 
  35.  { 
  36.   define( 'REQUEST_ID' , config('app.log_prefix').Carbon::now()->timestamp ); 
  37.  } 
  38.    
  39.  /** 
  40.   * 注册 monolog pushHandler 
  41.   * @return void 
  42.   */ 
  43.  protected function log_configure() 
  44.  { 
  45.   $log_file = $this->getLogFile(); 
  46.   $log_max_files = $this->getLogMaxFiles(); 
  47.  
  48.   /** 
  49.    * @doc https://d.laravel-china.org/docs/5.4/errors#自定义-Monolog-设置 
  50.    */ 
  51.   $this->app->configureMonologUsing(function($monolog) use ($log_file , $log_max_files) { 
  52.    $monolog->pushHandler( 
  53.     (new \Monolog\Handler\RotatingFileHandler( 
  54.      $log_file , 
  55.      $log_max_files 
  56.     ))->setFormatter(new \Monolog\Formatter\LineFormatter( "[%datetime%] [".REQUEST_ID."] %channel%.%level_name%: %message% %context% %extra%\n", null, true, true)) 
  57.    ); 
  58.   }); 
  59.  } 
  60.  
  61.  protected function getLogMaxFiles() 
  62.  { 
  63.   return config('app.log_max_files' , 5); 
  64.  } 
  65.  
  66.  /** 
  67.   * @return mixed 
  68.   */ 
  69.  protected function getLogFile() 
  70.  { 
  71.   if( is_null( $this->log_file) ) 
  72.   { 
  73.    $this->log_file = rtrim(config('app.log_path') , DIRECTORY_SEPARATOR )."/laravel.log"; 
  74.   } 
  75.   return $this->log_file; 
  76.  } 
  77. } 

优化以后

  1. namespace App\Providers; 
  2.  
  3. use Illuminate\Support\ServiceProvider; 
  4. use Monolog\Formatter\LineFormatter; 
  5. use Monolog\Handler\RotatingFileHandler; 
  6. use Carbon\Carbon; 
  7. use Monolog\Logger;; 
  8. use ReflectionClass; 
  9.  
  10. class LogServiceProvider extends ServiceProvider 
  11. { 
  12.  protected $log_file; 
  13.  
  14.  /** 
  15.   * Bootstrap any application services. 
  16.   * 
  17.   * @return void 
  18.   */ 
  19.  public function boot() 
  20.  { 
  21.   // 
  22.  } 
  23.  
  24.  /** 
  25.   * Register any application services. 
  26.   * 
  27.   * @return void 
  28.   */ 
  29.  public function register() 
  30.  { 
  31.   $this->loadRequestId(); 
  32.  
  33.   /** 
  34.    * 根据日期来分割日志 
  35.    */ 
  36.   $this->useDailyFiles(); 
  37.  
  38.  } 
  39.  
  40.  protected function loadRequestId() 
  41.  { 
  42.   define( 'REQUEST_ID' , config('app.log_prefix').Carbon::now()->timestamp ); 
  43.  } 
  44.  
  45.  /** 
  46.   * 根据日期来分割日志 
  47.   */ 
  48.  protected function useDailyFiles() 
  49.  { 
  50.   $handler = $this->getDailyHandler()->setFormatter( $this->getDefaultFormatter() ); 
  51.  
  52.   $errorHandler = $this->getDailyHandler(Logger::ERROR)->setFormatter( $this->getDefaultFormatter() ); 
  53.  
  54.   $this->app->configureMonologUsing( function( $monolog) use ( $handler , $errorHandler ) 
  55.   { 
  56.    $monolog->pushHandler( $handler ); 
  57.  
  58.    $monolog->pushHandler( $errorHandler ); 
  59.   }); 
  60.  } 
  61.  
  62.  /** 
  63.   * 设置 日志 行格式 
  64.   * @return LineFormatter 
  65.   */ 
  66.  protected function getDefaultFormatter() 
  67.  { 
  68.   $format = "[%datetime%] [".REQUEST_ID."] %channel%.%level_name%: %message% %context% %extra%\n"; 
  69.   return new LineFormatter( $format , null, true, true); 
  70.  } 
  71.  
  72.  
  73.  /** 
  74.   * 根据日志区分 
  75.   * @return \Monolog\Handler\RotatingFileHandler 
  76.   */ 
  77.  protected function getDailyHandler( $level = Logger::DEBUG) 
  78.  { 
  79.   return new RotatingFileHandler( 
  80.    $this->logPath().$this->logName( $level ) , 
  81.    $this->maxFiles() , 
  82.    $level 
  83.   ); 
  84.  } 
  85.  
  86.  /** 
  87.   * 日志文件最多个数 
  88.   * @return int 
  89.   */ 
  90.  protected function maxFiles() 
  91.  { 
  92.   if ($this->app->bound('config')) { 
  93.    return $this->app->make('config')->get('app.log_max_files', 30); 
  94.   } 
  95.  
  96.   return 0; 
  97.  } 
  98.  
  99.  /** 
  100.   * 日志文件名称 
  101.   * @return mixed 
  102.   */ 
  103.  protected function logPath() 
  104.  { 
  105.   $logPath = $this->app->storagePath()."/logs/"; 
  106.   if( $this->app->bound('config')) 
  107.   { 
  108.    $logPath = $this->app->make('config')->get('app.log_path', $logPath ); 
  109.   } 
  110.   return $logPath; 
  111.  } 
  112.  
  113.  /** 
  114.   * log 完整文件名 
  115.   * @param int $level 
  116.   * @return string 
  117.   */ 
  118.  protected function logName( $level = Logger::DEBUG ) 
  119.  { 
  120.   return $this->getAppName().'-'.$this->getLevelName( $level ).".log"; 
  121.  } 
  122.  
  123.  /** 
  124.   * 获取项目app 
  125.   * @return mixed 
  126.   */ 
  127.  protected function getAppName() 
  128.  { 
  129.   return $this->app->make('config')->get('app.name'); 
  130.  } 
  131.  
  132.  /** 
  133.   * 获取log错误级别名称 
  134.   * @param $level 
  135.   * @return mixed 
  136.   */ 
  137.  protected function getLevelName( $level ) 
  138.  { 
  139.   $r = new ReflectionClass( Logger::class ); 
  140.   $constants = array_flip( $r->getConstants() ); 
  141.   return $constants[$level]; 
  142.  } 
  143. }

Tags: Laravel日志位置 monolog

分享到: