yii2错误日志默认不写入文件,需显式配置filetarget并确保logfile用@runtime别名、runtime目录可写、yii::error()第二参数为exception实例,且开发时设flushinterval=1和exportinterval=1才能实时查看。

Yii2 错误日志记录后不会自动“显示”在页面上,它默认只写入目标(如文件、控制台),要看到内容必须主动查看或配置输出通道。
日志写了但找不到 app.log 文件?先确认 FileTarget 是否生效
Yii2 的 log 组件默认不写文件——它只往 PHP 错误日志或浏览器控制台(ChromePhpTarget)发消息。调用 Yii::error() 后没生成 runtime/logs/app.log,大概率是 targets 根本没配,或配了但没加载。
- 必须在
config/web.php的components中显式声明'log' => ['targets' => [...]],且至少一个 target 是yii\log\FileTarget -
logFile必须用别名,比如'@runtime/logs/app.log';写成'logs/app.log'或相对路径会静默失败 - 检查
runtime/目录权限:ls -l runtime/确保 Web 进程用户(如www-data)有读写权限 - 别在控制器里动态追加:
Yii::$app->log->targets[] = [...]—— 初始化完成后修改无效
日志写了但内容没堆栈?检查 Yii::error() 第二个参数类型
只有传 Exception 实例,Yii 才会自动附加完整 trace;传字符串、数组、$e->getMessage() 都只记消息本身,堆栈全丢。
- ✅ 正确:
Yii::error('DB failed', $e);——$e是Exception对象 - ❌ 错误:
Yii::error('DB failed', $e->getMessage());或Yii::error('DB failed', ['code' => $e->getCode()]); - 想带上下文又保留 trace?用
extra键:Yii::error('DB failed', ['exception' => $e, 'sql' => $sql]);,但得确保FileTarget::$except没过滤掉exception
日志写了但看不到实时内容?调整 flushInterval 和 exportInterval
Yii2 默认批量处理日志:消息先进内存缓冲区,等请求结束或缓冲满才刷出。开发时这会导致 Yii::debug() 或 Yii::info() 看不到即时输出。
- 在
FileTarget配置中加这两项:'flushInterval' => 1(每 1 条就 flush)、'exportInterval' => 1(每 1 条就导出) - 注意性能代价:设为 1 会增加 I/O,仅建议开发环境启用
- 生产环境别这么干;如需调试,可用
Yii::getLogger()->flush();手动触发
最常被忽略的一点:日志路径、权限、参数类型三者任一出错,都会导致“写了却像没写”——不是框架坏了,而是静默跳过,连错误提示都没有。查不到日志时,别急着重装,先 ls -l runtime/、再翻 config、最后看 Yii::error() 调用方式。











