必须将 flushInterval 和 exportInterval 均设为 1,才能使 Yii::debug() 和 VarDumper::dump() 的调试信息实时写入日志文件;同时需确保 log 组件已启用、targets 配置正确、levels 包含 debug,并检查 categories 过滤与文件路径权限。

你在 Yii2.0.55 中调用 Yii::debug() 或 VarDumper::dump() 后,日志文件始终为空、控制台看不到输出、调试面板里查不到记录——这不是代码写错了,而是日志缓冲机制在“拦路”,必须精准调整两个关键参数才能让调试信息秒级落地。
确认日志组件已启用且未被禁用
打开 config/web.php(或 config/main.php),检查 'bootstrap' => ['log'] 是否存在且位于顶层数组中。缺失该配置会导致所有日志消息直接丢弃,【任何后续配置都无效】。
检查 'components' => ['log' => [...]] 是否定义,且其 'class' 未被注释或覆盖为 null。若使用了自定义 Logger 类,请确保它继承自 yii\log\Logger 并正确实现 dispatch() 方法。
强制日志实时写入:FileTarget 核心参数调优
找到 'targets' 数组中使用的 yii\log\FileTarget 配置项,添加或修改以下两项:
设置 'flushInterval' => 1:让日志器每收到 1 条消息就立即刷新到目标队列,避免默认的 1000 条缓冲延迟。
设置 'exportInterval' => 1:让 FileTarget 每收到 1 条待导出消息就立刻写入磁盘文件,跳过批量合并逻辑。这两个值必须同时设为 1 才能真正实现实时落盘。
注意:exportInterval 设为 1 会略微增加 I/O 开销,但开发阶段完全可接受;生产环境切勿保留此配置。
让 VarDumper 输出进日志文件
方法一:用 VarDumper::dumpAsString() + Yii::info()
Yii::info(VarDumper::dumpAsString($data, 10, true), 'vardump'); —— 这会把变量结构转成纯字符串,再交由日志系统处理,安全写入文件。
方法二:重定向 VarDumper::dump() 的输出流
在控制器开头加 ob_start();,调用 VarDumper::dump($var);,再用 $output = ob_get_clean(); 捕获内容,最后 Yii::debug($output);。这一步绕过了浏览器直出,确保内容进入日志管道。
验证调试信息是否进入日志目标
第一步:确认 'levels' 包含 'debug' 和 'trace' —— 默认 FileTarget 只记录 error 和 warning,【不加 debug 就永远看不到 Yii::debug()】。
第二步:检查 'categories' 过滤是否过于严格。例如配置了 'categories' => ['pay'],但你调用的是 Yii::debug('msg', 'app'),则该消息会被静默丢弃。
第三步:手动触发一次日志导出:在任意 action 结尾加 Yii::getLogger()->flush();,强制清空缓冲区。如果此时日志文件突然出现内容,说明就是 flushInterval/exportInterval 配置未生效。
快速定位日志文件路径与权限
执行 echo Yii::getAlias('@runtime/logs'); 获取真实路径,确认该目录存在且 Web 进程用户(如 www-data)有写权限。
若日志文件名含日期后缀(如 app.log.2026-08-06),检查 'maxFileSize' 和 'maxLogFiles' 是否导致频繁轮转,新消息被写进新文件而你正在查看旧文件。
直接运行 ls -l $(dirname $(Yii::getAlias('@runtime/logs'))) 查看父目录权限,常见错误是 @runtime 目录属主为 root,Web 进程无权创建 logs 子目录。


















