### 2019 年 7 月 28 日 发布

`6.0`的日志类比之前版本完善了很多,主要新特性包括:

* 日志信息格式化

* 多通道写入支持

* 延时/实时写入

* 日志信息处理事件

* 日志级别指定通道写入

* 支持关闭日志/通道

新版的日志类最大的变化就是支持多通道写入,也就是说你可以同时或者给部分日志类型增加另外的日志通道写入,例如对于一些异常日志可以选择发送错误到邮件通知。

其它的变化主要包括:

* WEB日志和CLI日志合并并统一格式;

* 默认不再记录访问信息,需要可以自己记录;

* 独立日志也支持JSON格式记录;

日志的相关配置可以在`config/log.php`文件中设置,本篇主要描述下新版日志的变化。

## 日志通道

日志通道的概念相当于给日志信息做了一个日志空间,每个日志通道的日志信息采用独立的写入机制或者配置参数,你可以给日志信息指定默认的日志通道,也可以动态切换通道写入,并且支持同一个日志信息同时写入多个日志通道。

你可以在日志配置文件的`channels`配置中定义通道,默认仅定义了一个`file`通道

```

// 日志通道列表

'channels' => [

'file' => [

// 日志记录方式

'type' => 'File',

// 日志保存目录

'path' => '',

// 单文件日志写入

'single' => false,

// 独立日志级别

'apart_level' => [],

// 最大日志文件数量

'max_files' => 0,

// 使用JSON格式记录

'json' => false,

// 日志输出格式化

'format' => '[%s][%s] %s',

// 是否实时写入

'realtime_write' => false,

],

// 其它日志通道配置

],

```

每个日志通道必须指定`type`参数,该参数决定了日志的写入方式是什么,`file`就表示文件日志方式写入,如果需要指定其它的写入方式需要安装额外的扩展。但你也可以给不同的日志通道指定相同的`type`,只是其它的配置参数不同,例如写入的路径不同之类。

无论使用什么日志写入类型,每个日志通道可以支持的通用配置如下:

参数|说明

---|---

level|日志通道记录的日志级别

realtime_write|日志是否实时写入

`level`参数的用法和全局日志配置一致,除了在命令行模式下,默认的日志都是在请求结束后统一一次性写入,如果需要实时写入日志信息需要设置。

```

'realtime_write' => true,

```

>[danger] 如果在命令行下,无论是否设置都会自动实时写入日志。

### 默认通道

通过设置`default`参数定义日志的默认通道,例如:

```

'default' => 'file',

```

### 级别通道

可以设置不同的日志级别使用不同的日志通道

```

'type_channel'=>[

// 对于error日志级别 同时写入file和email两个日志通道

'error'=>['file','email'],

]

```

>[danger] 设置了级别通道后,该级别的日志不会记录到默认通道,请注意。

日志通道需要日志驱动的配合,你也可以自定义日志驱动。

### 切换通道

你也可以手动切换当前的日志的默认写入通道,例如:

```

Log::channel('email')->info('这是日志信息');

```

支持切换使用多个通道记录,例如:

```

Log::channel(['email', 'file'])->info('这是日志信息');

```

## 日志处理

日志写入支持事件监听,例如。

~~~

Event::listen('think\event\LogWrite', function($event) {

if('file' == $event->channel) {

$event->log['info'][] = 'test info';

}

});

~~~

闭包的参数是`LogWrite`事件类对象实例,你可以获取两个属性:

属性名|描述

----|----

channel |写入日志的通道名

log |写入的日志信息

日志信息是一个二维数组,包含了当前日志通道下(允许记录的)所有级别的日志信息。

## 格式化日志信息

系统提供了两个参数用于日志信息的格式化,第一个是用于自定义时间显示格式的`time_format`,第二个是调整日志输出格式的`format`参数。

```

'channels' => [

'file' => [

'type' => 'file',

'json' =>true

'file_size' => 1024*1024*10,

'time_format' => 'Y-m-d H:i:s',

'format' => '[%s][%s]:%s',

],

],

```

`format`参数的第一个`%s`是日志记录时间(日志时间的格式化由`time_format`参数定义) 第二个`%s`是日志级别 第三个`%s`是日志信息,顺序不能调整。

## JSON格式日志

可以支持`JSON`格式记录文件日志,更加方便一些第三方日志分析工具进行日志分析。

在日志配置文件中,添加

~~~

return [

'default' => 'file',

'channels' => [

'file' => [

'type' => 'file',

'json' =>true

'file_size' => 1024*1024*10,

],

],

];

~~~

即可开启`JSON`格式记录,CLI命令行的日志记录同样有效。

>[danger] 和之前版本的区别在于,新版的每个日志信息都是一条JSON数据(旧版本是每个请求一条JSON数据)。

## 关闭日志

你可以通过调用`close`方法动态关闭日志写入。

```

// 关闭全局日志写入

Log::close();

// 关闭某个通道日志写入

Log::close('file');

```

如果调用`close`方法动态关闭日志,会自动调用`clear`方法清空日志。

## 清空日志

一旦执行`save`方法后,内存中的日志信息就会被自动清空,如果需要提前清空日志可以使用:

```

// 清空所有日志

Log::clear();

//清空通道日志可以使用

Log::clear('file');

```

在清空日志方法之前,你可以使用`getLog`方法获取内存中的日志。

~~~

// 获取(默认通道)日志

$logs = Log::getLog();

// 获取指定通道日志

$logs = Log::getLog('file');

~~~

>[danger] 日志清空仅仅是清空内存中的日志。

## 自定义驱动

日志通道需要自定义日志驱动,该日志驱动需要实现`think\contract\LogHandlerInterface`接口。

```

interface LogHandlerInterface

{

/**

* 日志写入接口

* @access public

* @param array $log 日志信息

* @return bool

*/

public function save(array $log): bool;

}

```

cli能记日志web不能php,ThinkPHP6.0日志变化相关推荐

  1. Android10.0 日志系统分析(四)-selinux、kernel日志在logd中的实现​-[Android取经之路]

    摘要:本节主要来讲解Android10.0 selinux.kernel日志在logd中的实现,包括LogAudit.LogKlog的源码分析 阅读本文大约需要花费15分钟. 文章首发微信公众号:In ...

  2. Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析-[Android取经之路]

    摘要:本节主要来讲解Android10.0 logd.logcat读写日志源码内容 阅读本文大约需要花费20分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...

  3. Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化-[Android取经之路]

    摘要:本节主要来讲解Android10.0 日志系统的架构分析,以及logd.logcat的初始化操作 阅读本文大约需要花费15分钟. 文章首发微信公众号:IngresGe 专注于Android系统级 ...

  4. Android10.0 日志系统分析(一)-logd、logcat 指令说明、分类和属性-[Android取经之路]

    摘要:本节主要来讲解Android10.0 日志系统的logd.logcat相关指令说明.日志分类和常用日志属性 阅读本文大约需要花费15分钟. 文章首发微信公众号:IngresGe 专注于Andro ...

  5. 自己闲来无事做的工作日志WEB程序(VB.NET)

    代码下载在 :http://cnnet.europe.webmatrixhosting.net/example/worklog.rar 以下的服务器取消了===取消====服务器关了 [2003.09 ...

  6. web漏洞 云盾_云盾WAF实现虚拟补丁——记一起Web漏洞应急响应

    原标题:云盾WAF实现虚拟补丁--记一起Web漏洞应急响应 来自真实案例的虚拟总结.见招拆招,而且还得以最快的速度完成,云盾WAF扛得起! 忧伤的周六早晨 "云盾.先知"的渗透测试 ...

  7. python web 服务器实时监控 websocket_python实现websocket服务器,可以在web实时显示远程服务器日志...

    一.开始的话 使用python简单的实现websocket服务器,可以在浏览器上实时显示远程服务器的日志信息. 之前做了一个web版的发布系统,但没实现在线看日志,每次发布版本后,都需要登录到服务器上 ...

  8. go语言web开发系列之五:gin用zap+file-rotatelogs实现日志记录及按日期切分日志

    一,安装需要用到的库: 1,安装zap日志库: liuhongdi@ku:/data/liuhongdi/zaplog$ go get -u go.uber.org/zap 2,安装go-file-r ...

  9. 服务器系统事件日志删除部分,web 服务器的系统事件日志

    web 服务器的系统事件日志 内容精选 换一换 本节操作指导用户查看Windows弹性云服务器的登录日志.本节操作以2012操作系统云服务器为例.登录弹性云服务器.选择"开始 > 管理 ...

最新文章

  1. 服务器架设笔记——使用Apache插件解析简单请求
  2. 《网页设计创意书》读后感
  3. 华中科技大学计算机上机,华中科技大学计算机学院上机复试题目.doc
  4. 七周三次课(11月29日) 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法...
  5. Python-random标准库知识小结
  6. python中itemgetter函数_Python中的sorted函数以及operator.itemgetter函数
  7. Oracle Rman 命令详解(List report backup configure)
  8. 【职场】程序员摆地摊都能月入过万,是真的吗?
  9. 技术人员职业生涯的红色警报
  10. server sql 水平分表_springboot集成Shardingsphere进行分库分表
  11. python网络验证系统_python3+django2 开发易语言网络验证(下)
  12. 怎么更改wifi频段_wifi信号差?网速慢?这样做不浪费每一兆宽带
  13. 王者权志龙回归!支持爱豆壁纸少不了
  14. 从测试用例角度来看传统测试人员更专业?
  15. 2015 多校联赛 ——HDU5302(矩阵快速幂)
  16. 391 卡信乐卡盟程序
  17. python开发抢票软件_12306抢票软件run python版
  18. php里macd预测算法,股票MACD指标算法公式
  19. kettle启动时报错:Maximum wait time of 10 seconds exceed while acquiring lock
  20. GeeM2传奇引擎进入游戏出现白屏的解决办法

热门文章

  1. bzoj 1716 找零钱
  2. Spring Boot官网概述
  3. 翻译:TRUNCATE TABLE(已提交到MariaDB官方手册)
  4. 用一道面试题考察对闭包的理解
  5. window.location.hash属性介绍
  6. 【语言处理与Python】4.7算法设计
  7. INSTALLSHIELD11.5中打包水晶报表的问题,ScriptProject与ScriiptMSIProject差异引起的错误!...
  8. 双系统(win7+ubuntu)ubuntu磁盘空间不足时解决方法
  9. 一次Web请求返回406原因与解决方案
  10. webpack1.x环境配置与打包基础【附带各种 “坑“ 与解决方案!持续更新中...】