自定义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框架的性能
Jan 10 PHP
在PHP中使用curl_init函数的说明
Nov 02 PHP
php header Content-Type类型小结
Jul 03 PHP
PHP手机号码归属地查询代码(API接口/mysql)
Sep 04 PHP
PHP中获取时间的下一周下个月的方法
Mar 18 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
Oct 14 PHP
php跨服务器访问方法小结
May 12 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 PHP
php微信公众号开发之简答题
Oct 20 PHP
统计PHP目录中的文件数方法
Mar 05 PHP
php中try catch捕获异常实例详解
Aug 06 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中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
Javascript - HTML的request类
2006/07/15 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
Python找出9个连续的空闲端口
2016/02/01 Python
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
12步教你理解Python装饰器
2016/02/25 Python
python占位符输入方式实例
2019/05/27 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
使用python画社交网络图实例代码
2019/07/10 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
Django权限设置及验证方式
2020/05/13 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
最新创业融资计划书
2014/01/19 职场文书
五年级音乐教学反思
2014/02/06 职场文书
一夜的工作教学反思
2014/02/08 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
社区服务活动小结
2014/07/08 职场文书
兵马俑的导游词
2015/02/02 职场文书
商务考察邀请函模板
2015/02/02 职场文书