yii 2 日志组件默认不写文件,需显式配置 filetarget;日志级别和 category 可过滤;传 exception 对象才能记录堆栈;轮转靠 maxfilesize(kb)和 maxlogfiles 控制。

Yii 2 日志组件默认不写文件?检查 targets 配置是否生效
Yii 2 的 log 组件默认只把日志输出到浏览器控制台(ChromePhpTarget)或 PHP 错误日志(SyslogTarget),不会自动写入 runtime/logs/。常见现象是调用 Yii::error() 后看不到日志文件,其实是目标没配。
- 必须在
components中显式配置'log' => ['targets' => [...]],且至少一个 target 的class是FileTarget -
FileTarget默认写入@runtime/logs/app.log,路径由logPath控制,但别硬编码,用别名更安全 - 如果
runtime目录不可写,FileTarget会静默失败——查不到日志时先ls -l runtime/
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning', 'info'],
'logFile' => '@runtime/logs/myapp.log',
],
],
],
日志级别和 category 怎么过滤?用 levels 和 categories 精确控制
盲目记录所有日志会导致文件膨胀、掩盖关键问题。Yii 2 的 FileTarget 支持按级别(error/warning/info/trace)和 category(如 application、yii\db\Command)筛选。
-
levels是字符串数组,'levels' => ['error']就只记错误;漏掉info就看不到Yii::info()输出 -
categories可以缩小范围,比如只想记录数据库慢查询:['yii\db\Command::query', 'yii\db\Command::execute'] - category 匹配支持通配符:
'yii\db.*'会捕获所有数据库相关日志 - 注意:category 名称大小写敏感,
'YII\DB'不匹配'yii\db'
为什么 Yii::error('msg', $exception) 没打出堆栈?要传对第二个参数类型
Yii 2 的 Yii::error() 第二个参数如果是 Exception 实例,会自动附加完整 trace;但如果传了数组、字符串甚至 null,就只记消息本身,堆栈丢失。
- 正确写法:
Yii::error('DB failed', $e);——$e是Exception对象 - 错误写法:
Yii::error('DB failed', $e->getMessage());或Yii::error('DB failed', ['code' => $e->getCode()]);,trace 全丢 - 想手动加上下文又保留 trace?用
extra键:Yii::error('DB failed', ['exception' => $e, 'sql' => $sql]);,但需确保FileTarget::$except没过滤掉exception
日志轮转(rotation)怎么设?靠 maxFileSize 和 maxLogFiles
不设轮转,app.log 会无限增长,直到磁盘爆掉或打开变慢。Yii 2 的 FileTarget 原生支持基于大小的滚动,但参数名容易误解。
-
maxFileSize单位是 KB,不是 MB ——10240表示 10MB,写成10就是 10KB,日志一天就切几十个文件 -
maxLogFiles是保留的归档文件数,比如设为5,则最多有app.log+app.log.1~app.log.5 - 轮转触发时机是“写入前检查”,所以单条日志超限不会拆分,而是整个文件达到阈值后重命名再新建
- 注意:轮转依赖
filemtime()和rename(),NFS 或某些容器挂载卷可能不支持原子重命名,导致轮转失败
runtime 目录权限和 maxFileSize 的单位。前者让日志彻底消失,后者让轮转形同虚设——改完配置记得 touch runtime/logs/.keep && chmod -R 775 runtime/,再确认下数字是不是真按 KB 算的。











