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 相关文章推荐
PHP5.0对象模型探索之抽象方法和抽象类
Sep 05 PHP
删除数组元素实用的PHP数组函数
Aug 18 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
Jul 29 PHP
用Simple Excel导出xls实现方法
Dec 06 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
Oct 23 PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 PHP
PHP正则验证Email的方法
Jun 15 PHP
PHP实现的简单分页类及用法示例
May 06 PHP
php 使用curl模拟登录人人(校内)网的简单实例
Jun 06 PHP
laravel高级的Join语法详解以及使用Join多个条件
Oct 16 PHP
mac pecl 安装php7.1扩展教程
Oct 17 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
PHP 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
php+webSoket实现聊天室示例代码(附源码)
2017/02/17 PHP
javascript测试题练习代码
2012/10/10 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
Jquery AJAX POST与GET之间的区别
2013/11/14 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
Vue Cli与BootStrap结合实现表格分页功能
2017/08/18 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
python base64 decode incorrect padding错误解决方法
2015/01/08 Python
Python常用内置函数总结
2015/02/08 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
canvas 下载二维码和图片加水印的方法
2018/03/21 HTML / CSS
数控专业毕业生求职信范文
2013/09/21 职场文书
应届生英语教师求职信
2013/11/05 职场文书
制药工程专业职业生涯规划范文
2014/03/10 职场文书
高考备战决心书
2014/03/11 职场文书
遗产继承公证书
2014/04/09 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python