自定义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 相关文章推荐
推荐文章系统(一)
Oct 09 PHP
array_multisort实现PHP多维数组排序示例讲解
Jan 04 PHP
我的php学习笔记(毕业设计)
Feb 21 PHP
php array的学习笔记
May 10 PHP
深入解析PHP中逗号与点号的区别
Aug 05 PHP
PHP Session机制简介及用法
Aug 19 PHP
PHP利用APC模块实现文件上传进度条的方法
Jan 26 PHP
php使用数组填充下拉列表框的方法
Mar 31 PHP
php生成验证码函数
Oct 20 PHP
PHP微信分享开发详解
Jan 14 PHP
Bootstrap+PHP实现多图上传功能实例详解
Apr 08 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 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
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
PHP实现添加购物车功能
2017/03/06 PHP
PHP分享图片的生成方法
2018/04/25 PHP
Javascript 汉字字节判断
2009/08/01 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
2016/09/05 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
VsCode里的Vue模板的实现
2020/08/12 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
python使用cookie库操保存cookie详解
2014/03/03 Python
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
Python编写生成验证码的脚本的教程
2015/05/04 Python
Python中的变量和作用域详解
2016/07/13 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
写给爸爸的道歉信
2014/01/15 职场文书
个人课题方案
2014/05/08 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
安全教育第一课观后感
2015/06/17 职场文书
草房子读书笔记
2015/06/29 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python