自定义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 小乘法表实现代码
Jul 16 PHP
使用JSON实现数据的跨域传输的php代码
Dec 20 PHP
PHP防止post重复提交数据的简单例子
Jun 07 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
Mar 15 PHP
非常经典的PHP文件上传类分享
May 15 PHP
php实现等比例不失真缩放上传图片的方法
Nov 14 PHP
thinkPHP订单数字提醒功能的实现方法
Dec 01 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 PHP
PHP实现找出链表中环的入口节点
Jan 16 PHP
使用ucenter实现多站点同步登录的讲解
Mar 21 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 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+APACHE实现用户论证的方法
2006/10/09 PHP
PHP 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
PHP图像处理类库及演示分享
2015/05/17 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
js打开新窗口方法整理
2014/02/17 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
Python 列表list使用介绍
2014/11/30 Python
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
大专应届生个人的自我评价
2013/11/21 职场文书
给朋友的道歉信
2014/01/09 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
2014年小学元旦活动方案
2014/02/12 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
上诉答辩状范文
2015/05/22 职场文书
生日宴会祝酒词
2015/08/10 职场文书
会计手工模拟做账心得体会
2016/01/22 职场文书
Python基于百度AI实现抓取表情包
2021/06/27 Python
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB
python绘制云雨图raincloud plot
2022/08/05 Python