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 URL验证正则表达式
Jul 19 PHP
使用PHP实现Mysql读写分离
Jun 28 PHP
PHP include任意文件或URL介绍
Apr 29 PHP
简单谈谈php延迟静态绑定
Jan 26 PHP
php判断邮箱地址是否存在的方法
Feb 13 PHP
Symfony控制层深入详解
Mar 17 PHP
Thinkphp和onethink实现微信支付插件
Apr 13 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
May 13 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
PHP 二维array转换json的实例讲解
Aug 21 PHP
PHP attributes()函数讲解
Feb 03 PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 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邮件专题
2006/10/09 PHP
php 购物车实例(申精)
2009/05/11 PHP
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
JavaScript 图像动画的小demo
2012/05/23 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
如何在项目中使用log4.js的方法步骤
2019/07/16 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
家长给老师的道歉信
2014/01/13 职场文书
上课看小说检讨书
2014/02/22 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
新闻学专业求职信
2014/07/28 职场文书
社保委托书怎么写
2014/08/02 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang
Python FuzzyWuzzy实现模糊匹配
2022/04/28 Python
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript