Yii2 log组件默认不写文件,必须在config/web.php顶层配置'bootstrap'=>['log']并显式声明FileTarget,logFile须用'@runtime'别名且runtime目录需web用户可写。

Yii2 的 log 组件默认不写文件,也不自动启用任何目标(Target)——调用 Yii::error() 后看不到日志,基本就是这个原因。
log 组件必须显式声明并加入 bootstrap
它不是开箱即用的组件,必须手动注册进启动流程,否则整个日志调度链路不会初始化。
-
'bootstrap' => ['log']要加在应用配置顶层(config/web.php或config/console.php),不能只放在components里 -
components中的'log'配置块必须存在,且至少含一个targets数组;空数组或缺失targets键等于没配 - 别在控制器、行为或 runtime 中动态修改
Yii::$app->log->targets—— 初始化完成后追加无效
FileTarget 是最常用目标,但路径和权限容易静默失败
它负责把日志写进文件,但错一个细节就完全不落盘,且不报错。
-
logFile必须用别名(如'@runtime/logs/app.log'),写'logs/app.log'或./runtime/logs/app.log会静默跳过 -
runtime/目录需对 Web 进程用户(如www-data、nginx)有rw-权限;执行ls -l runtime/确认属主和权限位 -
maxFileSize单位是 KB,不是 MB;设成10240才是 10MB,写成10就是 10KB,一天切几十个文件 - 轮转后旧文件权限继承自原文件,若需统一 chmod,可设
fileMode => 0644
DbTarget 需要提前建表,且依赖 db 组件可用
它把日志存进数据库,但不会自动创建表,也不会提示“表不存在”。
- 先确保
components中已正确定义'db',且能连通 - 运行命令:
./yii migrate --migrationPath=@yii/log/migrations/,生成{{%log}}表 - 若用自定义表名(如
system_log),必须在 DbTarget 配置中显式指定'logTable' => '{{%system_log}}' - 生产环境建议关闭
enableSchemaCheck,由 DBA 统一管理表结构,避免迁移冲突
categories 和 levels 控制日志内容,漏配就看不到想查的日志
它们是过滤器,不是开关。配错就等于“关掉了”,而且毫无提示。
-
levels是字符串数组:['error', 'warning']才会记录Yii::error()和Yii::warning();漏掉'info',Yii::info()就不会落地 -
categories大小写敏感,'yii\db'匹配所有数据库操作,'YII\DB'完全不匹配 - 想捕获慢 SQL,推荐:
'categories' => ['yii\db\Command::execute'],比'yii\db.*'更精准,减少噪音 - 传
Exception对象才能带 trace:写Yii::error('msg', $e);写Yii::error('msg', $e->getMessage())就只剩字符串,堆栈全丢
最常被忽略的是 bootstrap 声明和 logFile 别名写法——这两处出错,日志系统根本没启动,后面所有配置都白搭。


















