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写的小东西
Dec 06 PHP
收集的DedeCMS一些使用经验
Mar 17 PHP
PHP ajax 分页类代码
Nov 13 PHP
php读取3389的脚本
May 06 PHP
PHP函数http_build_query使用详解
Aug 20 PHP
yii2带搜索功能的下拉框实例详解
May 12 PHP
Yii视图操作之自定义分页实现方法
Jul 14 PHP
浅谈关于PHP解决图片无损压缩的问题
Sep 01 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 PHP
基于PHP实现的多元线性回归模拟曲线算法
Jan 30 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 PHP
php使用自带dom扩展进行元素匹配的原理解析
May 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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
PHP在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
一个ftp类(ini.php)
2006/10/09 PHP
一些关于PHP的知识
2006/11/17 PHP
php5.2时间相差8小时
2007/01/15 PHP
解析isset与is_null的区别
2013/08/09 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
javascript radio 联动效果
2009/03/04 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
一看就懂:jsonp详解
2015/06/01 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
[08:02]DOTA2牵红线 zhou神抱得美人归
2014/03/22 DOTA
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
pycharm打开命令行或Terminal的方法
2019/01/16 Python
python tornado使用流生成图片的例子
2019/11/18 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
Html5定位终极解决方案
2020/02/05 HTML / CSS
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
骨干教师培训感言
2014/01/16 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
学习张林森心得体会
2014/09/10 职场文书
党员承诺书格式范文
2015/04/28 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript