thinkphp6日志分离核心是通道+级别+路径协同:定义pay/access/error独立通道并隔离路径,按需设置level,启用apart_level自动归类错误,异常处理器补录未捕获错误至error通道。

ThinkPHP6 实现业务日志与错误日志分离,核心不是“多建几个文件”,而是通过通道(channel)+ 级别(level)+ 路径(path)三者协同,让不同性质的日志走不同路径、受不同策略控制。关键要避免混写、误过滤、漏告警。
定义独立通道并隔离路径
在 config/log.php 的 channels 中显式声明业务通道和错误专用通道,每个通道必须指定独立 path(以斜杠结尾),且 type 首字母大写:
-
pay:专用于支付流水,路径设为
runtime_path('log/pay/') -
access:门禁通行事件,路径设为
runtime_path('log/access/') -
error:全局错误捕获通道,路径设为
runtime_path('log/error/')
不要复用默认 file 通道,否则 level 和 path 控制会互相干扰。
按通道设置差异化记录级别
每个通道可独立配置 level,决定它接收哪些日志级别,这比全局 level 更精准:
-
'pay' => ['info', 'error']:记录支付成功(info)和失败(error),便于对账与排查 -
'access' => ['warning', 'error']:只收异常通行(如黑名单拦截、无效卡号),减少噪音 -
'error' => ['error', 'critical', 'alert', 'emergency']:严格只收高危错误,确保告警不被淹没
注意:调用时必须显式指定通道,例如 Log::channel('pay')->info('订单支付成功'),否则走默认通道,归属就乱了。
启用 apart_level 实现错误日志自动归类
在 error 通道配置中开启 apart_level,让不同严重程度的错误自动写入不同文件,方便快速定位:
- 设
'apart_level' => ['error', 'critical', 'alert'] - 结果:
20261003_error.log、20261003_critical.log、20261003_alert.log各自独立 - SQL 日志建议单独通道(如
sql),不混入 error 通道,避免干扰故障判断
确保错误日志能捕获未处理异常
业务通道只响应主动调用,而 500 错误等未捕获异常需在异常处理器中补录到 error 通道:
- 修改
app/exception/Handle.php的report()方法 - 加入:
Log::channel('error')->error($e->getMessage() . "\n" . $e->getTraceAsString()); - 同时记录请求 URL、真实 IP(
request()->header('x-forwarded-for', request()->ip()))、参数(过滤敏感字段)
这样,即使用户看到 500 页面,完整上下文也已落盘到 error/ 目录下,不依赖前端反馈。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











