ThinkPHP6.x需引入Monolog实现精细化异常日志管理:移除全局Log类与socket驱动后,须绕过内置门面,通过composer安装Monolog,重写exception Handle的report()方法交由Monolog处理,并配置多级处理器、JsonFormatter及敏感信息过滤器。

ThinkPHP6.x 默认日志系统已移除全局 Log 类,也不再支持原生 socket 驱动,异常日志若仅依赖默认文件记录,难以满足生产环境对分级、集中、可追溯和安全审计的要求。要实现精细化异常日志管理,必须引入 Monolog 并定制驱动——核心在于**绕过内置 Log 门面的默认行为,接管异常捕获链路,并按场景配置处理器与格式器**。
一、安装与基础集成
确保 PHP ≥ 7.3,执行:
composer require monolog/monolog:^2.10- 确认
vendor/autoload.php可被正常加载(无需手动require,Composer 自动处理) - 避免混用 TP5 的
Log::write(),全部改用\think\facade\Log或容器获取方式
二、接管异常日志:替换默认异常处理器
TP6 的异常由 think\exception\Handle 统一处理,默认只写入文件且不带上下文。需在 app/exception/Handle.php 中重写 report() 方法,将异常交由 Monolog 处理:
- 在
report()中获取已绑定的 Monolog 实例(如通过容器app('monolog')) - 调用
$logger->error($e->getMessage(), ['exception' => $e, 'trace' => $e->getTraceAsString()]) - 关键点:传入完整异常对象(非仅消息),便于后续解析堆栈、类名、行号等元数据
三、配置多级处理器应对不同异常场景
不要只用一个 StreamHandler。建议组合使用:
立即学习“PHP免费学习笔记(深入)”;
-
高频错误降级记录:用
RotatingFileHandler按天轮转 + 保留 30 天,级别设为WARNING,避免磁盘打满 -
严重异常实时告警:添加
NativeMailerHandler或SlackWebhookHandler,仅响应CRITICAL和EMERGENCY级别 -
远程统一归集:启用
SocketHandler推送至日志服务器(如自建 rsyslog 或 Logstash),host/port 需配置在config/log.php中
四、格式化与敏感信息控制
默认日志易暴露密码、token、用户身份证等。必须做两件事:
- 使用
JsonFormatter替代LineFormatter,结构化字段便于 ELK 解析;开启ignoreEmptyContextAndExtra避免空字段污染 - 在处理器前加一层
Processor,例如自定义SanitizeProcessor,自动过滤password、token、card_no等键名的值,替换为[REDACTED] - 生产环境务必关闭
log.trace = false,禁用全量调用栈,防止性能骤降



















