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翻页类
Jun 01 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
Nov 07 PHP
给ECShop添加最新评论
Jan 07 PHP
PHP学习笔记(三):数据类型转换与常量介绍
Apr 17 PHP
php中删除、清空session的方式总结
Oct 09 PHP
修复ShopNC使用QQ 互联时提示100010 错误
Nov 08 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
Jun 30 PHP
Yii2 RESTful中api的使用及开发实例详解
Jul 06 PHP
PHP回调函数简单用法示例
May 08 PHP
PHPExcel实现的读取多工作表操作示例
Apr 14 PHP
php swoft框架实例用法
Dec 22 PHP
PHP序列化和反序列化深度剖析实例讲解
Dec 29 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边学边教》(01.开篇――准备工作)
2006/12/13 PHP
通过具体程序来理解PHP里面的抽象类
2010/01/28 PHP
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
一个简洁实用的PHP缓存类完整实例
2014/07/26 PHP
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
基于vue组件实现猜数字游戏
2020/05/28 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
selenium+python自动化测试之页面元素定位
2019/01/23 Python
linux安装python修改默认python版本方法
2019/03/31 Python
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
安全生产责任书
2014/03/12 职场文书
社区消防工作实施方案
2014/03/21 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
仓库管理计划书
2014/05/04 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
2014公司年终工作总结
2014/12/19 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
2016年国陪研修感言
2015/11/18 职场文书
Python实现的扫码工具居然这么好用!
2021/06/07 Python
Node实现搜索框进行模糊查询
2021/06/28 Javascript
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL