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中动态HTML的输出技术
Oct 09 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
Aug 21 PHP
phpmailer发送gmail邮件实例详解
Jun 24 PHP
深入解析Session是否必须依赖Cookie
Aug 02 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
Oct 14 PHP
thinkphp获取栏目和文章当前位置的方法
Oct 29 PHP
php+mysql删除指定编号员工信息的方法
Jan 14 PHP
简单实现PHP留言板功能
Dec 21 PHP
PHP处理Ajax请求与Ajax跨域问题
Feb 13 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
Aug 17 PHP
laravel框架数据库配置及操作数据库示例
Oct 10 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动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
谨慎使用PHP的引用原因分析
2012/09/06 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
提交表单后 PHP获取提交内容的实现方法
2016/05/25 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
2016/12/24 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
JS实现队列与堆栈的方法
2016/04/21 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
JS调用打印机功能简单示例
2016/11/28 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
深入理解angular2启动项目步骤
2017/07/15 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
JavaScript在web自动化测试中的作用示例详解
2019/08/25 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
Python 实现黑客帝国中的字符雨的示例代码
2020/02/20 Python
Python yield的用法实例分析
2020/03/06 Python
解决django 向mysql中写入中文字符出错的问题
2020/05/18 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
意大利奢侈品网站:Italist
2016/08/23 全球购物
如何清空Session
2015/02/23 面试题
个人自我评价分享
2013/12/20 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
嘉年华活动新闻稿
2015/07/17 职场文书
销售会议开幕词
2016/03/04 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android