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 代码优化的42条建议 推荐
Sep 25 PHP
PHP 自定义错误处理函数trigger_error()
Mar 26 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
php实现smarty模板无限极分类的方法
Dec 07 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 PHP
PHP PDOStatement::fetchObject讲解
Feb 01 PHP
PHP字符串中抽取子串操作实例分析
Jun 22 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
Aug 11 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修改Linux或Unix口令的方法分享
2012/01/30 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
Linux系统下PHP-FPM的安装和配置教程
2015/08/17 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
2011/12/31 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
jQuery中focus事件用法实例
2014/12/26 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
Bootstrap CSS布局之图像
2016/12/17 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
JS实现数据动态渲染的竖向步骤条
2020/06/24 Javascript
JS实现小米轮播图
2020/09/21 Javascript
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
解决uWSGI的编码问题详解
2017/03/24 Python
Python将图片转换为字符画的方法
2020/06/16 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
简单了解python的内存管理机制
2019/07/08 Python
python实现canny边缘检测
2020/09/14 Python
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
中文专业毕业生自荐书范文
2014/01/04 职场文书
幼儿园亲子活动方案
2014/01/29 职场文书
软件项目实施计划书
2014/05/02 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
七一建党日演讲稿
2014/09/05 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
运动会观后感
2015/06/09 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL