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 相关文章推荐
在线短消息收发的程序,不用数据库
Oct 09 PHP
PHP Session变量不能传送到下一页的解决方法
Nov 27 PHP
Fatal error: Call to undefined function curl_init()解决方法
Apr 09 PHP
php 各种应用乱码问题的解决方法
May 09 PHP
PHP学习之数组值的操作
Apr 17 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
Nov 10 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
Jun 19 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
Mar 05 PHP
php采用session实现防止页面重复刷新
Dec 24 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
php mysql_list_dbs()函数用法示例
Mar 29 PHP
如何让PHP编码更加好看利于阅读
May 12 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 include_path设置技巧分享
2011/07/03 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
JS简单获取日期相差天数的方法
2017/04/24 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
js自定义input文件上传样式
2018/10/26 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
详解React 元素渲染
2020/07/07 Javascript
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
sort命令的作用和用法
2012/11/04 面试题
优秀的导游求职信范文
2014/04/06 职场文书
初中生评语大全
2014/04/24 职场文书
语文教研活动总结
2014/07/02 职场文书
2015高考寄语集锦
2015/02/27 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
优秀创业计划书分享
2019/07/19 职场文书