经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
自定义Laravel (monolog)日志位置,并增加请求ID的实现
来源:jb51  时间:2019/10/18 8:32:57  对本文有异议

修改 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. });

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

  1. -rw-r--r-- 1 web web 93 Dec 18 15:52 laravel-2017-12-17
  2. -rw-r--r-- 1 web web 279 Dec 18 16:10 laravel-2017-12-18

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

或者

创建app\Providers\LogServiceProvider.php 文件

修改 config\app.php providers 增加

  1. 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. * 注册 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($monolog) use ($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. if( is_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. }
  76. }

优化以后

  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. }

以上这篇自定义Laravel (monolog)日志位置,并增加请求ID的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号