自定义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 header Content-Type类型小结
Jul 03 PHP
php 判断数组是几维数组
Mar 20 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
Jun 27 PHP
php用header函数实现301跳转代码实例
Nov 25 PHP
Zend Framework页面缓存实例
Jun 25 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
smarty高级特性之对象的使用方法
Dec 25 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
Nov 28 PHP
PHP实现的CURL非阻塞调用类
Jul 26 PHP
php-fpm重启导致的程序执行中断问题详解
Apr 29 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
PHP 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
php flush类输出缓冲剖析
2008/10/19 PHP
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
CURL的学习和应用(附多线程实现)
2013/06/03 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
如何手写一个简易的 Vuex
2020/10/10 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
朴素贝叶斯算法的python实现方法
2014/11/18 Python
django 修改server端口号的方法
2018/05/14 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
python math模块的基本使用教程
2021/01/16 Python
Html5 audio标签样式的修改
2016/01/28 HTML / CSS
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
新东网科技Java笔试题
2012/07/13 面试题
美术教学感言
2014/02/22 职场文书
置业顾问岗位职责
2014/03/02 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android
postgresql中如何执行sql文件
2023/05/08 PostgreSQL