# 日志处理
### 日志配置
日志的配置文件是配置文件目录下的`log.php`文件,系统在进行日志写入之前会读取该配置文件进行初始化
```
return [
// 默认日志记录通道
'default' => 'file',
// 日志记录级别
'level' => [],
// 日志类型记录的通道 ['error'=>'email',...]
'type_channel' => [],
// 日志通道列表
'channels' => [
'file' => [
// 日志记录方式
'type' => 'File',
// 日志保存目录
'path' => '',
// 单文件日志写入
'single' => false,
// 独立日志级别
'apart_level' => [],
// 最大日志文件数量
'max_files' => 0,
],
// 其它日志通道配置
],
];
```
可以添加多个日志通道,每个通道可以设置不同的日志类型。日志配置参数根据不同的日志类型有所区别,内置的日志类型包括:`file`,日志类型使用`type`参数配置即可。
> 如果是自定义驱动,`type`的值则为自定义驱动的类名(包含命名空间)
日志全局配置参数:
| 参数 | 描述 |
| --- | --- |
| default | 默认的日志通道 |
| level | 允许记录的日志级别 |
| type_channel | 日志类型记录的通道 |
> 默认的日志类型是`File`方式,可以通过驱动的方式来扩展支持更多的记录方式。
文件类型日志的话,还支持下列配置参数:
| 参数 | 描述 |
| --- | --- |
| path | 日志存储路径 |
| file_size | 日志文件大小限制(超出会生成多个文件) |
| apart_level | 独立记录的日志级别 |
| time_format | 时间记录格式 |
| single | 是否单一文件日志 |
| max_files | 最大日志文件数(超过自动清理 ) |
| format | 日志输出格式 |
| realtime_write | 是否实时写入 |
> 为了避免同一个目录下面的日志文件过多的性能问题,日志文件会自动生成日期子目录。
### 日志写入
一般日志是自动写入的,手动写入日志使用这两个方法
>record 方法(记录日志信息到内存)
```
Log::record('日志信息');
//默认日志级别是info,也可以手动指定
Log::record('这是一条警告日志','notice');
```
>write方法(实时记录)
```
Log::write('测试日志信息,这是警告级别,并且实时写入','notice');
```
配置文件中开启实时写入
```
// 实时写入
'realtime_write' => true,
```
### 关闭日志
```
Log::close();
```
### 日志级别
日志的级别从低到高依次为:`debug`,`info`,`notice`,`warning`,`error`,`critical`,`alert`,`emergency`,ThinkPHP额外增加了一个`sql`日志级别仅用于记录`SQL`日志(并且仅当开启数据库调试模式有效)
> 系统发生异常后记录的日志级别是`error`
```
Log::error('错误信息');
Log::info('日志信息');
```
提供助手函数
```
trace('错误信息', 'error');
trace('日志信息', 'info');
```
>默认情况下是不会记录HTTP异常日志(避免受一些攻击的影响写入大量日志),除非你接管了系统的异常处理,重写了`report`方法
### 日志上下文
日志可以传入上下文信息(数组),并且被替换到日志内容中
```
Log::info('日志信息{user}',['user'=>'张三']);
```
### 独立日志
为了便于分析,`File`类型的日志还支持设置某些级别的日志信息单独文件记录:
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
// error和sql日志单独记录
'apart_level' => ['error','sql'],
],
],
];
```
设置后,就会单独生成`error`和`sql`两个类型的日志文件,主日志文件中将不再包含这两个级别的日志信息
> 如果`apart_level`设置为`true`,则表示所有的日志类型都会独立记录
### 单文件日志
默认情况下,日志是按照日期为目录,按天为文件生成的,但如果希望仅生成单个文件(方便其它的工具或者服务读取以及分析日志)
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
'single' => true,
'file_size' => 1024*1024*10,
],
],
];
```
开启生成单个文件后,`file_size`和`apart_level`参数依然有效,超过文件大小限制后,系统会自动生成备份日志文件。
默认的单文件日志名是`single.log`,如果需要更改日志文件名,可以设置
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
'single' => 'single_file',
'file_size' => 1024*1024*10,
],
],
];
```
那么实际生成的日志文件名是`single_file.log`,如果设置了`apart_level`的话,可能还会生成`single_file_error.log`之类的日志
> 单文件日志也支持`max_files`参数设置,因为单文件日志同样会生成多个日志备份文件而导致日志文件数据过大
### 写入处理
日志支持写入回调处理,通过事件的方式处理。
```
Event::listen('think\event\LogWrite', function($event) {
if('file' == $event->channel) {
$event->log['info'][] = 'test info';
}
});
```
### 格式化日志信息
系统提供了两个参数用于日志信息的格式化,第一个是用于自定义时间显示格式的`time_format`,第二个是调整日志输出格式的`format`参数
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
'json' => true
'file_size' => 1024*1024*10,
'time_format' => 'Y-m-d H:i:s',
'format' => '[%s][%s]:%s',
],
],
];
```
### 清空日志
一旦执行`save`方法后,内存中的日志信息就会被自动清空,如果需要手动清空可以使用:
```
Log::clear();
```
在清空日志方法之前,你可以使用`getLog`方法获取内存中的日志。
```
// 获取全部日志
$logs = Log::getLog();
```
> 日志清空仅仅是清空内存中的日志。
### 日志自动清理
文件类型的日志支持自动清理。可以设置`max_files`参数,超过数量的最早日志将会自动删除。
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
'max_files' => 30,
'file_size' => 1024*1024*10,
],
],
];
```
> 设置`max_files`参数后,日志文件将不会分日期子目录存放。
### JSON格式日志
可以支持`JSON`格式记录文件日志,更加方便一些第三方日志分析工具进行日志分析。
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
'json' => true
'file_size' => 1024*1024*10,
],
],
];
```
即可开启`JSON`格式记录,CLI命令行的日志记录同样有效。
使用JSON格式记录后,每次请求是一行JSON数据,但如果使用`Log::write`记录的日志是例外的单独一行JSON数据。
### 日志通道
你可以配置不同的日志通道,并且把不同的日志记录到不同的通道。
```
Log::channel('email')->info('一条测试日志');
Log::channel('socket')->error('记录错误日志');
```
你可以配置不同的日志类型,记录到不同的日志通道,这样在记录日志的时候会自动选择对应的通道写入。
```
return [
'default' => 'file',
'type_channel' => [
'error' => 'email',
'sql' => 'sql',
],
'channels' => [
'file' => [
'type' => 'file',
],
'email' => [
'type' => 'email',
],
'sql' => [
'type' => 'sql',
],
],
];
```
表示如果是`error`日志和`sql`日志,会分别记录到指定的通道。同时你还需要在日志配置文件中,添加`email`和`sql`日志通道的配置。核心只有`file`日志类型,其它的可能需要自己扩展或者安装扩展。
如果需要获取内存中的通道日志信息,可以使用
```
// 获取某个日志通道的日志
$error = Log::getLog('file');
```
可以单独关闭某个通道的日志写入,只需要把日志通道的`close`配置参数设置为`true`,或者使用方法关闭。
```
Log::close('file');
```
可以单独清空某个通道的日志(如果没有开启实时写入的话)
```
Log::clear('file');
```
### 自定义驱动
如果需要自定义日志驱动,你需要实现`think\contract\LogHandlerInterface`接口。
```
interface LogHandlerInterface
{
/**
* 日志写入接口
* @access public
* @param array $log 日志信息
* @return bool
*/
public function save(array $log): bool;
}
```
- 序言
- 系统简介
- 系统介绍
- 前端脑图
- 项目介绍
- 新手入门(源码安装)
- 运行环境
- 服务器配置及安装
- 视频安装教程
- 服务器及环境搭建
- 服务器购买
- 域名购买
- 域名解析
- 服务器配置
- 宝塔配置
- 创建站点
- 安装项目
- 1.源码上传(必看内容)
- 2.PHP扩展安装
- 3.环境配置
- 4.运行服务
- 5.一键安装
- 注意事项(很重要)
- 重启swoole服务
- linux安装swoole方法
- 特别注意事项
- mysql 5.7注意事项
- https域名
- ssl证书申请
- 公众号配置
- 公众号配置
- 公众号开发配置
- 公众号菜单
- 设置公众号菜单
- 关键字
- 跳转网页
- 跳转小程序
- 小程序配置
- 1.微信平台配置
- 2.CRMEB后台配置
- 3.前端提交审核
- 4.确认发布
- 支付配置
- 支付配置
- 公众号支付
- 小程序支付
- 支付宝支付
- 其他配置
- 公众号模板消息
- 小程序订阅消息
- 商业授权
- 授权说明
- 申请授权
- 安装常见问题汇总
- 请修改sql_mode文件为NO_AUTO提示
- 版本更新
- 客服设置
- uni-app 打包H5、公众号
- 版本更新
- 清空数据
- 测试域名
- 部署多套多商户
- 使用说明
- 商品分类
- 分类说明
- 分类管理
- 品牌分类
- 商品标签
- 商品管理
- 发布商品
- 商品规格
- 配置说明
- 文件上传
- 移动端展示说明
- 首页
- 分类页
- 个人中心
- 热门搜索
- 分销规则
- 分销配置
- 分销员管理
- 分销规则说明
- 分销员等级
- 分销礼包
- 佣金说明
- 用户管理
- 商户用户管理
- 平台用户管理
- 用户协议
- 用户搜索记录
- 秒杀
- 秒杀规则
- 开启秒杀活动
- 直播
- 主播实名认证
- 开启直播
- 添加直播商品
- 预售
- 开启全款预售
- 开启定金预售
- 预售协议
- 专题
- 后台配置
- 前端展示
- 助力
- 开启助力
- 查看助力活动
- 拼团
- 虚拟拼团设置
- 开启拼团
- 查看拼团活动
- 积分
- 积分设置
- 积分来源
- 积分使用
- 提现
- 提现规则
- 提现步骤
- 新闻资讯
- 新闻页面
- 发布资讯
- 账户管理
- 账号信息
- 账户资金
- 优惠券
- 添加优惠券
- 发布优惠券
- 领取及使用
- 发放优惠券
- 订单管理
- 后台订单处理
- 前端订单处理
- 订单退款
- 订单打印
- 客服管理
- 添加客服
- 客服权限
- 门店自提
- 开启门店自提
- 设置核销权限
- 订单核销说明
- 商户管理
- 商户分类
- 商户入驻
- 商户列表
- 商户菜单管理
- 店铺类型
- 财务
- 财务对账
- 发票管理
- 自动分账(v1.5及以后版本)
- 邮费说明
- 运费设置
- 运费组成
- 运费模板
- 物流配置
- 公告管理
- 店铺相关
- 店铺定位设置
- 店铺街入口
- 店铺活动
- 店铺基本信息设置
- 小票打印
- 小票打印机配置
- 小票打印机设置
- 技术文档
- 开发规范
- 数据字典
- 目录结构
- 移动端路由
- 系统配置
- 后台表单说明
- 短信设置
- 短信账户
- 短信配置
- 短信模板
- 一号通
- 电子面单
- 短信提醒
- 商品采集
- 物流查询
- 付费采集商品配置
- PC端展示说明
- PC端开启
- PC端平台页面配置
- PC端店铺页面配置
- 保障服务
- 移动端商品管理
- 开启移动端商品管理
- 功能说明
- 会员管理
- 会员管理
- 会员权益
- 会员配置
- 社区功能
- 社区分类
- 社区话题
- 社区文章
- 社区评论
- 社区配置
- 通知管理
- 移动前端
- 目录结构
- 配置说明
- 页面路径
- 后台前端说明
- 总后台目录结构
- 商户后台目录结构
- 开发和构建
- APP 打包
- 基础配置
- 开发调试
- 打包上线
- App打包
- PC端说明
- 安装教程
- 目录结构
- 打包教程
- 常见问题
- 服务器问题
- 服务器环境说明
- MySQL 5.7注意事项
- PHP fileinfo扩展安装
- 后台登录页幻灯片
- 后台登录页logo
- 论坛常见问题汇总
- 个人中心菜单加链接
- 子账号登录名
- 前后端分离配置
- 重启swoole进程
- 开论坛勋章
- 源码下载地址
- 查看/隐藏版本号
- 搜索商品后服务挂了
- 开发文档
- 架构
- config配置文件
- 容器和依赖注入
- 异常处理
- 路由
- 控制器模块
- 日志处理
- 自定义指令
- CRMEB类库
- Basic基类
- Exceptions异常处理
- Interfaces接口类
- Jobs消息队列
- services服务类
- traits
- listens定时监听类
- 接口流程
- Controller
- Repository
- Dao
- Model
- 流程
- 订单流程
- 下单流程
- 退款流程
- 二开教程
- 定义新的接口
- 创建新的页面
- 创建新的组合数据
- 更换短信模板