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入门速成(2)
Oct 09 PHP
PHP 数据库树的遍历方法
Feb 06 PHP
php 表单验证实现代码
Mar 10 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
Jun 18 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
CI框架给视图添加动态数据
Dec 01 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
给WordPress中的留言加上楼层号的PHP代码实例
Dec 14 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
Mar 21 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
Jun 20 PHP
解决laravel 表单提交-POST 异常的问题
Oct 15 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
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
canvas知识总结
2017/01/25 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
vue项目中添加单元测试的方法
2018/07/21 Javascript
解决layui中的form表单与button的点击事件冲突问题
2018/08/15 Javascript
使用python 获取进程pid号的方法
2014/03/10 Python
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
美国时尚女装在线:Missguided
2016/12/03 全球购物
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
关于打架的检讨书
2014/01/17 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
解除劳动合同协议书
2014/04/14 职场文书
党员服务承诺书
2014/05/28 职场文书
公务员四风问题对照检查材料整改措施
2014/09/26 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
生产设备维护保养制度
2015/08/06 职场文书
pycharm2021激活码使用教程(永久激活亲测可用)
2021/03/30 Python