ThinkPHP 6.0 支持通过多通道+级别分流实现 error 日志独立推送:1. 在 config/log.php 新增 error 专用通道,指定 level 和 type;2. 借助 Monolog 实现邮件/HTTP 推送;3. 代码中显式调用 Log::channel('error_mail')->error();4. 避免主通道重复记录并确保目录权限与异步发送。

ThinkPHP 6.0 可以通过配置独立的日志通道,将 error 级别日志单独推送到指定位置(如文件、邮件、远程服务等),而其他级别(info、warning 等)走默认通道。这不是靠“过滤 level”,而是靠 多通道 + 级别分流 实现的。
1. 新增一个专用于 error 的日志通道
在 config/log.php 的 channels 数组中,添加一个新通道(比如叫 error_mail 或 error_file),并明确指定它只处理 error 及以上级别:
- 设置
'level' => ['error', 'critical', 'alert', 'emergency'] - 设置
'type' => 'file'(写入独立文件)或'type' => 'monolog'(对接邮件、Slack、Webhook 等) - 指定唯一路径,如
'path' => runtime_path('log/error/') . date('Ym') . '/',避免和主日志混在一起
2. 配置 Monolog 实现错误推送(推荐用于邮件/HTTP)
若需把 error 日志实时发邮件或调用接口,需借助 Monolog:
- 先执行:
composer require monolog/monolog - 在通道配置中使用
type => 'monolog',并通过handler闭包返回自定义 Handler - 例如用
NativeMailerHandler发邮件,或CurlHandler推送至告警平台 - 务必在 handler 中传入
$level = Logger::ERROR,确保只捕获错误级事件
3. 在代码中触发 error 日志时自动走该通道
TP6 支持按通道名写日志,无需改业务逻辑:
- 正常记录:
Log::channel('error_mail')->error('数据库连接失败', ['host' => $host]); - 也可在全局异常处理器(
app/exception/Handle.php)中统一调用,确保所有未捕获异常都进入该通道 - 注意不要用
Log::error()(走默认通道),必须显式指定channel()
4. 补充:避免重复记录与权限问题
单独通道不等于“额外多记一份”,而是分流。需检查:
- 主通道(如
file)的level配置是否排除了error,否则会重复写入 - 如果写文件,确保
runtime/log/error/目录存在且 Web 进程有写权限 - 若用邮件,建议加队列异步发送,防止阻塞请求(可封装为
SendErrorNoticeJob)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











