ThinkPHP 8.0 默认支持日志分级记录,通过配置 level 和语义化方法(如 info()、error())触发对应级别写入,并结合多通道(如 common、error)与 File 驱动实现按级分离存储。

ThinkPHP 8.0 默认已支持日志分级记录,核心是通过配置 level 和使用不同日志方法(如 log()、info()、warn()、error() 等)触发对应级别写入,再配合日志通道的 type(如 File、Single)和 level 过滤规则实现分级存储。
配置日志通道级别与输出规则
在 config/log.php 中,可为每个通道单独设置最低记录级别和日志类型。例如,让 error 日志单独写入 error.log,其他级别写入 common.log:
- 定义两个通道:
common(记录info及以上)和error(仅记录error和critical) -
common通道的'level' => ['info', 'notice', 'warning'] -
error通道的'level' => ['error', 'critical', 'alert', 'emergency'] - 确保
'default' => 'common',并开启多通道写入('default' => ['common', 'error'])
使用不同日志方法自动匹配级别
框架封装了语义化日志方法,调用即对应固定级别,无需手动传 level 参数:
-
Log::info('用户登录成功')→ 写入 info 级别 -
Log::warn('缓存未命中')→ 写入 warning 级别 -
Log::error('数据库连接失败:' . $e->getMessage())→ 写入 error 级别 - 所有方法都支持上下文数组,如
Log::info('订单创建', ['order_id' => 123, 'user_id' => 456])
按级别分离文件存储(File 驱动)
若使用 File 类型通道,可通过 file_name 或闭包动态生成文件名,实现“一级一文件”:
立即学习“PHP免费学习笔记(深入)”;
- 配置
'file_name' => function($level) { return $level . '.log'; } - 或更稳妥地,在
channel配置中为每个级别定义独立通道,各自指定'path'和'file' => 'error.log' - 注意:单个
File通道不支持运行时切换文件,需靠多通道或自定义驱动实现严格分级落盘
自定义驱动或中间件增强分级控制
如需更精细策略(如按模块、用户角色、API 路径过滤日志级别),可:
- 继承
think\log\driver\File,重写save()方法,根据$log['level']和上下文决定是否写入或写入哪个路径 - 在全局中间件中拦截异常,统一调用
Log::critical()并附加 trace 信息 - 利用
Log::listen()监听日志事件,做异步推送或级别降级(如把 warning 临时升为 error 记录)
不复杂但容易忽略的是:日志级别是“写入门槛”,不是“强制转换”。调用 Log::debug() 时,若当前通道 level 设为 info,该条日志会被直接丢弃——务必确认 app_debug 关闭时 debug 级别默认不生效,生产环境应避免依赖 debug 日志定位问题。



















