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 文件上传全攻略
Apr 28 PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 PHP
php多文件上传下载示例分享
Feb 20 PHP
php中call_user_func函数使用注意事项
Nov 21 PHP
详解PHP+AJAX无刷新分页实现方法
Nov 03 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
May 04 PHP
PHP获取当前执行php文件名的代码
Mar 02 PHP
Laravel框架实现的批量删除功能示例
Jan 16 PHP
PHP实现cookie跨域session共享的方法分析
Aug 23 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
May 26 PHP
如何利用PHP实现上传图片功能详解
Sep 24 PHP
Jsonp劫持学习
Apr 01 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实现jQuery扩展函数
2009/10/30 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
Javascript 跨域知识详细介绍
2016/10/30 Javascript
bootstrap+jQuery实现的动态进度条功能示例
2017/05/25 jQuery
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
Js中async/await的执行顺序详解
2017/09/22 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
整理Python最基本的操作字典的方法
2015/04/24 Python
Python 中 list 的各项操作技巧
2017/04/13 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
Python实现的删除重复文件或图片功能示例【去重】
2019/04/23 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
python regex库实例用法总结
2021/01/03 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
C语言编程题
2015/03/09 面试题
什么是网络协议
2016/04/07 面试题
交通事故调解协议书
2014/04/16 职场文书
廉洁自律承诺书2015
2015/01/22 职场文书
运动会开幕式主持词
2015/07/01 职场文书
vue首次渲染全过程
2021/04/21 Vue.js
用Java实现简单计算器功能
2021/07/21 Java/Android
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫