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 相关文章推荐
教你如何快捷的使用cmd访问mysql小技巧
May 26 PHP
Laravel 5框架学习之Blade 简介
Apr 08 PHP
php简单实现发送带附件的邮件
Jun 10 PHP
又十个超级有用的PHP代码片段
Sep 24 PHP
PHP环境中Memcache的安装和使用
Nov 05 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
Mar 17 PHP
php解决和避免form表单重复提交的几种方法
Aug 31 PHP
PHP计算近1年的所有月份
Mar 13 PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 PHP
使用laravel的migrate创建数据表的方法
Sep 30 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 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笔记之:日期函数的使用介绍
2013/04/24 PHP
php伪静态之APACHE篇
2014/06/02 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
由document.body和document.documentElement想到的
2009/04/13 Javascript
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
JS简单判断滚动条的滚动方向实现方法
2017/04/28 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
python中查找excel某一列的重复数据 剔除之后打印
2013/02/10 Python
python机器学习库常用汇总
2017/11/15 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
在TensorFlow中实现矩阵维度扩展
2020/05/22 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
详解Python模块化编程与装饰器
2021/01/16 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
九州传奇上机题
2014/07/10 面试题
物流专员岗位职责
2014/02/17 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
信用卡工资证明范本
2014/10/17 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript