评论

收藏

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

开发技术 开发技术 发布于:2021-11-08 13:55 | 阅读数:618 | 评论:0

今天小编就为大家分享一篇自定义Laravel (monolog)日志位置,并增加请求ID的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
修改 bootstrap/app.php 文件
$app->configureMonologUsing(function($monolog) use ($app) {
 $monolog->pushHandler(
  (new Monolog\Handler\RotatingFileHandler(
   '/var/logs/app/laravel',
   $app->make('config')->get('app.log_max_files', 5)
  ))->setFormatter(new Monolog\Formatter\LineFormatter(null, null, true, true))
 );
});
添加以后写入日志文件为:
-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 内容如下
<?php
 
namespace App\Providers;
 
use Illuminate\Log\LogServiceProvider as SysServiceProvider;
use Illuminate\Log\Writer;
 
class LogServiceProvider extends SysServiceProvider
{
 protected function configureSingleHandler(Writer $log)
 {
  $log->useFiles(
   '/var/logs/app/laravel.log',
   $this->logLevel()
  );
 }
 
 protected function configureDailyHandler(Writer $log)
 {
  $log->useDailyFiles(
   '/var/logs/app/laravel.log', $this->maxFiles(),
   $this->logLevel()
  );
 }
}
增加请求ID request id
namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
use Carbon\Carbon;
 
class LogServiceProvider extends ServiceProvider
{
 protected $log_file;
 
 /**
  * Bootstrap any application services.
  * @return void
  */
 public function boot()
 {
  //
 }
 
 /**
  * Register any application services.
  * @return void
  */
 public function register()
 {
  $this->load_request_id();
 
  $this->log_configure();
 }
 
 /**
  * 生成 request_id
  * @return void
  */
 protected function load_request_id()
 {
  define( 'REQUEST_ID' , config('app.log_prefix').Carbon::now()->timestamp );
 }
 
 /**
  * 注册 monolog pushHandler
  * @return void
  */
 protected function log_configure()
 {
  $log_file = $this->getLogFile();
  $log_max_files = $this->getLogMaxFiles();
 
  /**
   * @doc https://d.laravel-china.org/docs/5.4/errors#自定义-Monolog-设置
   */
  $this->app->configureMonologUsing(function($monolog) use ($log_file , $log_max_files) {
   $monolog->pushHandler(
  (new \Monolog\Handler\RotatingFileHandler(
   $log_file ,
   $log_max_files
  ))->setFormatter(new \Monolog\Formatter\LineFormatter( "[%datetime%] [".REQUEST_ID."] %channel%.%level_name%: %message% %context% %extra%\n", null, true, true))
   );
  });
 }
 
 protected function getLogMaxFiles()
 {
  return config('app.log_max_files' , 5);
 }
 
 /**
  * @return mixed
  */
 protected function getLogFile()
 {
  if( is_null( $this->log_file) )
  {
   $this->log_file = rtrim(config('app.log_path') , DIRECTORY_SEPARATOR )."/laravel.log";
  }
  return $this->log_file;
 }
}
优化以后
namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\RotatingFileHandler;
use Carbon\Carbon;
use Monolog\Logger;;
use ReflectionClass;
 
class LogServiceProvider extends ServiceProvider
{
 protected $log_file;
 
 /**
  * Bootstrap any application services.
  *
  * @return void
  */
 public function boot()
 {
  //
 }
 
 /**
  * Register any application services.
  *
  * @return void
  */
 public function register()
 {
  $this->loadRequestId();
 
  /**
   * 根据日期来分割日志
   */
  $this->useDailyFiles();
 
 }
 
 protected function loadRequestId()
 {
  define( 'REQUEST_ID' , config('app.log_prefix').Carbon::now()->timestamp );
 }
 
 /**
  * 根据日期来分割日志
  */
 protected function useDailyFiles()
 {
  $handler = $this->getDailyHandler()->setFormatter( $this->getDefaultFormatter() );
 
  $errorHandler = $this->getDailyHandler(Logger::ERROR)->setFormatter( $this->getDefaultFormatter() );
 
  $this->app->configureMonologUsing( function( $monolog) use ( $handler , $errorHandler )
  {
   $monolog->pushHandler( $handler );
 
   $monolog->pushHandler( $errorHandler );
  });
 }
 
 /**
  * 设置 日志 行格式
  * @return LineFormatter
  */
 protected function getDefaultFormatter()
 {
  $format = "[%datetime%] [".REQUEST_ID."] %channel%.%level_name%: %message% %context% %extra%\n";
  return new LineFormatter( $format , null, true, true);
 }
 
 
 /**
  * 根据日志区分
  * @return \Monolog\Handler\RotatingFileHandler
  */
 protected function getDailyHandler( $level = Logger::DEBUG)
 {
  return new RotatingFileHandler(
   $this->logPath().$this->logName( $level ) ,
   $this->maxFiles() ,
   $level
  );
 }
 
 /**
  * 日志文件最多个数
  * @return int
  */
 protected function maxFiles()
 {
  if ($this->app->bound('config')) {
   return $this->app->make('config')->get('app.log_max_files', 30);
  }
 
  return 0;
 }
 
 /**
  * 日志文件名称
  * @return mixed
  */
 protected function logPath()
 {
  $logPath = $this->app->storagePath()."/logs/";
  if( $this->app->bound('config'))
  {
   $logPath = $this->app->make('config')->get('app.log_path', $logPath );
  }
  return $logPath;
 }
 
 /**
  * log 完整文件名
  * @param int $level
  * @return string
  */
 protected function logName( $level = Logger::DEBUG )
 {
  return $this->getAppName().'-'.$this->getLevelName( $level ).".log";
 }
 
 /**
  * 获取项目app
  * @return mixed
  */
 protected function getAppName()
 {
  return $this->app->make('config')->get('app.name');
 }
 
 /**
  * 获取log错误级别名称
  * @param $level
  * @return mixed
  */
 protected function getLevelName( $level )
 {
  $r = new ReflectionClass( Logger::class );
  $constants = array_flip( $r->getConstants() );
  return $constants[$level];
 }
}
以上这篇自定义Laravel (monolog)日志位置,并增加请求ID的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持CodeAE代码之家
原文链接:https://blog.csdn.net/Webben/article/details/78834337

关注下面的标签,发现更多相似文章