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 相关文章推荐
初学CAKEPHP 基础教程
Nov 02 PHP
PHP与C#分别格式化文件大小的代码
May 14 PHP
php中get_headers函数的作用及用法的详细介绍
Apr 27 PHP
探讨:web上存漏洞及原理分析、防范方法
Jun 29 PHP
dedecms函数分享之获取某一栏目所有子栏目
May 19 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
PHP嵌套输出缓冲代码实例
May 12 PHP
php微信公众平台开发之获取用户基本信息
Aug 17 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
php实现微信原生支付(扫码支付)功能
May 30 PHP
PDO::getAvailableDrivers讲解
Jan 28 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基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
javascript代码加载优化方法
2011/01/30 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
js的.innerHTML = &quot;&quot;IE9下显示有错误的解决方法
2013/09/16 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
nodejs个人博客开发第一步 准备工作
2017/04/12 NodeJs
bootstrap表单示例代码分享
2017/05/18 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
p5.js入门教程之图片加载
2018/03/20 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
浅谈Python peewee 使用经验
2017/10/20 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
杭州联环马网络笔试题面试题
2013/08/04 面试题
写自荐信要注意什么
2013/12/26 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
开工典礼策划方案
2014/05/23 职场文书
2014年采购员工作总结
2014/11/18 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
投资意向协议书
2015/01/29 职场文书
大四学生个人总结
2015/02/15 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js