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


Posted in PHP onOctober 17, 2019

修改 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的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php木马攻击防御之道
Mar 24 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
Oct 12 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
PHP读取文件内容后清空文件示例代码
Mar 18 PHP
php 购物车完整实现代码
Jun 05 PHP
PHP安全上传图片的方法
Mar 21 PHP
php判断用户是否手机访问代码
Jun 08 PHP
yii实现model添加默认值的方法(2种方法)
Jan 06 PHP
php技巧小结【推荐】
Jan 19 PHP
php如何利用pecl安装mongodb扩展详解
Jan 09 PHP
详解PHP队列的实现
Mar 14 PHP
如何判断微信付款码和支付宝付款码
Apr 01 PHP
详解Laravel设置多态关系模型别名的方式
Oct 17 #PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
Oct 17 #PHP
PHP封装请求类实例分析【基于Yii框架】
Oct 17 #PHP
使用laravel指定日志文件记录任意日志
Oct 17 #PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 17 #PHP
thinkPHP事务操作简单案例分析
Oct 17 #PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 #PHP
You might like
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
php判断目录存在的简单方法
2019/09/26 PHP
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
超级简单实现JavaScript MVC 样式框架
2015/03/24 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
JS使用数组实现的队列功能示例
2019/03/04 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
python创建关联数组(字典)的方法
2015/05/04 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
车间调度岗位职责
2013/11/30 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
2015入党个人自传范文
2015/06/26 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
工作自我评价范文
2019/03/21 职场文书
Python竟然能剪辑视频
2021/05/25 Python
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技