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

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

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

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

修改 bootstrap/app.php 文件

  1. $app->configureMonologUsing(function($monologuse ($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.  protected function configureSingleHandler(Writer $log
  10.  { 
  11.   $log->useFiles( 
  12.    '/var/logs/app/laravel.log'
  13.    $this->logLevel() 
  14.   ); 
  15.  } 
  16.  
  17.  protected function configureDailyHandler(Writer $log
  18.  { 
  19.   $log->useDailyFiles( 
  20.    '/var/logs/app/laravel.log'$this->maxFiles(), 
  21.    $this->logLevel() 
  22.   ); 
  23.  } 

增加请求ID request id

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

优化以后

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

Tags: Laravel日志位置 monolog

分享到: