yii 2 默认不写日志文件,因 log 组件未配置 filetarget;需手动在 components 中声明含 yii\log\filetarget 的 targets,并确保 runtime/ 可写、categories 和 levels 匹配、传入 exception 实例才能记录堆栈。

Yii 2 默认不写日志文件,调用 Yii::error() 后看不到 app.log,不是代码没执行,是 FileTarget 根本没配。
log 组件没配 FileTarget 就不会写文件
Yii 2 的 log 组件默认只启用 ChromePhpTarget(开发时输出到 Chrome 控制台)或 SyslogTarget(写入系统日志),完全不碰 runtime/logs/。你得手动在 components 里声明 'log' => ['targets' => [...]],且至少一个 target 的 class 是 yii\log\FileTarget。
-
logFile推荐用别名,比如'@runtime/logs/app.log',别硬写绝对路径 - 确保
runtime/目录可写,否则FileTarget会静默失败——查不到日志时先ls -l runtime/ - 如果只配了
DbTarget或EmailTarget,但没配FileTarget,那日志确实不会落地成文件
levels 和 categories 不匹配就记不到想要的日志
光有 FileTarget 不够,还得让它的 levels 和 categories 覆盖你想捕获的内容。比如只设 'levels' => ['error'],那 Yii::info() 就不会写进去;又比如没加 'yii\db\Command' 到 categories,数据库慢查询日志就进不了 db.log。
-
levels是字符串数组:['error', 'warning', 'info'],漏掉哪个级别,对应Yii::xxx()就不记录 -
categories支持通配符:'yii\db.*'比'yii\db\Command'更宽泛,能捕获所有数据库子类日志 - 多个
FileTarget可共存,比如一个专记 error,一个专记yii\db.*,互不干扰
Exception 对象不传给 Yii::error() 就没有堆栈
直接 Yii::error('something went wrong') 只记字符串;要看到完整调用链和变量上下文,必须把 Exception 实例传进去:Yii::error($e, __METHOD__)。否则日志里只有时间戳和消息,没堆栈,根本没法定位哪行抛的异常。
- 常见错误写法:
Yii::error($e->getMessage())—— 堆栈丢了 - 正确写法:
Yii::error($e, 'app\models\User::save'),第二个参数是 category,建议用__METHOD__自动填充 - 调试阶段可临时把
traceLevel设为 3,让Yii::trace()也带函数调用位置
日志轮转靠 maxFileSize 和 maxLogFiles 控制
默认不轮转,app.log 会越写越大。靠 maxFileSize(单位 KB)和 maxLogFiles 两个参数控制:前者决定单个文件多大就切,后者决定最多留几个历史文件。
-
'maxFileSize' => 10240表示 10MB,超了就重命名成app.log.1,再超再滚 -
'maxLogFiles' => 5表示最多保留app.log加 4 个历史文件(.1到.4) - 这两个参数只对
FileTarget有效,其他 target 如DbTarget需自己实现归档逻辑
最容易被忽略的是 runtime/ 权限和 categories 的通配符匹配粒度——前者导致日志“消失”,后者导致日志“不全”,两者都看不出明显报错,只能靠排查路径和翻源码确认日志到底发去了哪里。











