yii日志配置核心是让关键问题“一眼可见、一查就准”:精准筛选(级别+category)、错误必带堆栈、关闭缓冲即时可见、文件轮转+路径+权限三件套。

Yii 日志配置的核心不是版本差异,而是目标明确:让关键问题“一眼可见、一查就准”。1.1、2.0、3.0 在日志机制上虽有类名和写法变化(如 CLogRouter → yii\log\Logger),但定位问题的逻辑完全一致——靠精准过滤 + 完整上下文 + 即时可见。下面分四点说清楚怎么做。
只记真正有用的信息:按级别和 category 精确筛选
盲目记录所有日志只会淹没关键线索。必须主动控制什么该记、什么该丢:
-
级别要收窄:生产环境通常只需
['error', 'warning'];调试阶段可加'info',但避免开'trace'(太吵) -
category 要具体:比如数据库慢查询,配
['yii\db\Command::query', 'yii\db\Command::execute'];用户登录异常,用['app.auth.login'] -
通配符慎用:
'yii\db.*'可捕获全部 DB 日志,但会显著增加体积;'app.*'比'*'更安全
错误必须带堆栈:传 Exception 对象,别传字符串
没堆栈的日志等于没线索。Yii 只在第二个参数是 Exception 实例时,才自动附加完整调用链:
- ✅ 正确:
Yii::error('Failed to save user', $e);—— $e 是抛出的异常对象 - ❌ 错误:
Yii::error('Failed to save user', $e->getMessage());或Yii::error('Failed to save user', ['msg' => $e->getMessage()]);—— 堆栈全丢 - ? 补充上下文?用数组包装:
Yii::error('DB timeout', ['exception' => $e, 'sql' => $sql, 'params' => $params]);,确保 target 的except没过滤掉exception
日志必须立刻可见:关掉缓冲,避免“写了却看不到”
默认日志会攒一批再写入,导致问题发生后查不到最新记录。尤其在调试或线上排查时,这很致命:
- 设
'flushInterval' => 1:每条日志都触发 flush(清空内存缓冲) - 设
'exportInterval' => 1:每次 flush 都立刻导出到目标(如文件) - 注意:这两个值在
log组件顶层或每个target里都可配,推荐统一放在 target 中更可控
文件管理要防失控:轮转+路径+权限三件套
日志不轮转,几天就撑爆磁盘;路径写死或权限不对,日志直接静默失败:
-
轮转靠两个参数:
'maxFileSize' => 1024 * 100(100KB,别设太大)、'maxLogFiles' => 20(最多留 20 个历史文件) -
路径用别名:
'logFile' => '@runtime/logs/app.log',别硬写/var/www/.../logs/;确保@runtime目录存在且可写(ls -l runtime/必查) -
按天分文件更直观(可选):
'logFile' => '@runtime/logs/' . date('Y-m-d') . '.log',适合人工快速翻阅
不复杂但容易忽略。配置完跑一次 Yii::error('test', new \Exception('test stack')),立刻去日志文件里看有没有时间戳、级别、category、完整堆栈——对了,才算到位。











