Laravel5.5以下版本中如何自定义日志行为详解


Posted in PHP onAugust 01, 2018

前言

在 Laravel 5.6 版本中日志行为可以很容易的进行自定义,而在5.5以下版本中日志行为自定义自由度并不是很高,但是项目有需求不能因为这个就强行将项目升级为5.6吧,况且作为一个稳定的项目升级框架大版本有可能会有很多坑,基于这些原因我尝试了对 Laravel 5.5 的日志进行改造以适应我的需求。

Laravel 的日志行为大部分是在 Illuminate\Log\LogServiceProvider 中,我们可以看一下其中的代码片段:

/**
 * Configure the Monolog handlers for the application.
 *
 * @param \Illuminate\Log\Writer $log
 * @return void
 */
protected function configureDailyHandler(Writer $log)
{
 $log->useDailyFiles(
  $this->app->storagePath().'/logs/laravel.log', $this->maxFiles(),
  $this->logLevel()
 );
}

这是我最常在项目中使用的日志存储方式,可以看到日志的存储路径几近与写死的状态,无法通过外部参数轻易的更改。

最开始我想的是重写这个 Provider 然后将其注册到 app.php 的 providers 数组中,但是这种行为并不可行,因为通过查看源码, LogServiceProvider 是在框架启动时就注册。

在 中有这样一个方法控制了这个注册行为:

protected function registerBaseServiceProviders()
{
 $this->register(new EventServiceProvider($this));

 $this->register(new LogServiceProvider($this));

 $this->register(new RoutingServiceProvider($this));
}

既然我们知道了它们是如何生效的,那么我们将这两个类继承并修改其中我们需要改变的行为进行改造,我的改造方式如下。在 app\Providers 中新建 LogServiceProvider 类继承 Illuminate\Log\LogServiceProvider ,代码如下:

<?php


namespace App\Providers;

use Illuminate\Log\LogServiceProvider as BaseLogServiceProvider;
use Illuminate\Log\Writer;

class LogServiceProvider extends BaseLogServiceProvider
{
 /**
  * Configure the Monolog handlers for the application.
  *
  * @param \Illuminate\Log\Writer $log
  * @return void
  */
 protected function configureDailyHandler(Writer $log)
 {
  $path = config('app.log_path');
  $log->useDailyFiles(
   $path, $this->maxFiles(),
   $this->logLevel()
  );
 }
}

在 config/app.php 目录中添加配置:

'log_path' => env('APP_LOG_PATH', storage_path('/logs/laravel.log')),

app 目录中新建 Foundation 目录,新建 Application 类继承 Illuminate\Foundation\Application 类,重写 registerBaseServiceProviders 方法。

<?php
/**
 * Created by PhpStorm.
 * User: dongyuxiang
 * Date: 2018/7/31
 * Time: 16:53
 */

namespace App\Foundation;

use App\Providers\LogServiceProvider;
use Illuminate\Events\EventServiceProvider;
use Illuminate\Routing\RoutingServiceProvider;
use Illuminate\Foundation\Application as BaseApplication;


class Application extends BaseApplication
{

 /**
  * Register all of the base service providers.
  *
  * @return void
  */
 protected function registerBaseServiceProviders()
 {
  $this->register(new EventServiceProvider($this));

  $this->register(new LogServiceProvider($this));

  $this->register(new RoutingServiceProvider($this));
 }
}

说是重写其实只是将use类换从了我们自己创建的 LogServiceProvider 。

然后在 bootstrap\app.php 中将变量 $app 的 new 对象换成我们继承重写后的。

$app = new App\Foundation\Application(
 realpath(__DIR__.'/../')
);

这样我就成功的将日志路径可以随便定义了,而且来说有了这次经验我对于框架不符合我需求的地方可以做更进一步的优化以符合我的要求,而且我没有更改框架底层的代码,当框架有bug修复的时候我也可以放心的进行框架更新。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
在php中取得image按钮传递的name值
Oct 09 PHP
用php将任何格式视频转为flv的代码
Sep 03 PHP
PHP的变量总结 新手推荐
Apr 18 PHP
PHP file_exists问题杂谈
May 07 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
Apr 10 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
Sep 20 PHP
thinkphp整合微信支付代码分享
Nov 24 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
Aug 07 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
Laravel实现ORM带条件搜索分页
Oct 24 PHP
PHP实现随机数字、字母的验证码功能
Aug 01 #PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 #PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 #PHP
PHP常用日期加减计算方法实例小结
Jul 31 #PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
Jul 30 #PHP
PHP笛卡尔积实现算法示例
Jul 30 #PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 #PHP
You might like
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
PHP生成plist数据的方法
2015/06/16 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
表单元素事件 (Form Element Events)
2009/07/17 Javascript
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[40:31]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
python用户管理系统的实例讲解
2017/12/23 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
Django serializer优化类视图的实现示例
2020/07/16 Python
django跳转页面传参的实现
2020/09/17 Python
python制作微博图片爬取工具
2021/01/16 Python
美国狗旅行和户外用品领先供应商:kurgo
2020/08/18 全球购物
PyQt 如何创建自定义QWidget
2021/03/24 Python
简历中求职的个人自我评价
2013/12/03 职场文书
职业生涯规划书基本格式
2014/01/06 职场文书
咖啡馆创业计划书
2014/01/26 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
齐云山导游词
2015/02/06 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书