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 相关文章推荐
PHP4实际应用经验篇(9)
Oct 09 PHP
php实现网站插件机制的方法
Nov 10 PHP
使用PHPMyAdmin修复论坛数据库的图文方法
Jan 09 PHP
Apache中php.ini的设置方法
Feb 28 PHP
zend Framework中的Layout(模块化得布局)详解
Jun 28 PHP
使用openssl实现rsa非对称加密算法示例
Jan 24 PHP
PHP exif扩展方法开启详解
Jul 28 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
May 20 PHP
Yii2设置默认控制器的两种方法
May 19 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Jan 22 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中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
深入研究PHP中的preg_replace和代码执行
2018/08/15 PHP
PDO::rollBack讲解
2019/01/29 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
JavaScript简介
2015/02/15 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
Python中list查询及所需时间计算操作示例
2018/06/21 Python
对numpy中向量式三目运算符详解
2018/10/31 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
python__name__原理及用法详解
2019/11/02 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
常见的软件开发流程有哪些
2015/11/14 面试题
How TDD works
2012/09/30 面试题
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
新教师个人总结
2015/02/06 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
SQL基础的查询语句
2021/11/11 MySQL
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫