Monolog 默认不写文件日志,开发环境仅输出到 console,var/log/dev.log 为空属正常;需手动添加 rotating_file handler 并正确配置 channels、level 和路径。

Monolog 默认日志路径在哪?
Symfony 6+ 默认用 Monolog,但不写文件——它把日志发给 console 或 php://stderr。你看到的终端输出、var/log/dev.log 为空,不是配错了,是根本没启用文件 handler。
- 默认配置里
main channel 的 handlers 只含 console(开发环境)或 nested(生产)
-
var/log/prod.log 看似存在,其实是 kernel.terminate 阶段 flush 出来的,且仅限部分错误级别
- 真正想按天分文件、自动轮转、保留 N 天,得手动加
stream 或 rotating_file handler
怎么加 RotatingFileHandler 写入文件?
改 config/packages/dev/monolog.yaml(开发)或 config/packages/prod/monolog.yaml(生产),在 handlers 下新增一个:
handlers:
file:
type: rotating_file
path: '%kernel.logs_dir%/app.log'
level: debug
max_files: 10
channels: ['!event', '!doctrine']
-
type: rotating_file 比 stream 更实用:自动按日期切分(如 app-2024-06-15.log),超 max_files 就删旧的
-
channels 排除 event 和 doctrine,避免日志爆炸(尤其开发时高频 event dispatch)
- 不要设
level: info 就以为能捕获所有请求——HTTP 请求日志默认走 request channel,需显式加入 channels 列表
为什么日志写了但看不到内容?
常见现象:文件创建了,权限也对,但始终空或只有几行。
-
kernel.debug: false 时,debug 级别日志被全局过滤,即使 handler 设了 level: debug 也无效;必须同步调高 monolog.handlers.file.level 和 monolog.channels.main.level
-
channels 配置错位:handler 的 channels 是“这个 handler 处理哪些 channel”,不是“把哪些 channel 的日志塞进来”;漏写 main 就等于没接上主日志流
- 文件路径用了相对路径如
logs/app.log,实际会拼到项目根目录下,而非 var/logs/;务必用 '%kernel.logs_dir%/xxx.log'
Symfony 5.4 升 6.x 后 Monolog 配置失效?
不是失效,是结构变了:v6 强制要求每个 handler 显式声明 channels,且不再支持顶层 handlers 直接挂到 main。
- 旧写法:
handlers: [console, file] → 新写法必须拆成独立 handler 块,并在 handlers 下明确定义
-
rotating_file 的 filename_format 参数被移除,格式固定为 {filename}-{date}.{extension},想改命名得自定义 handler 类
- 生产环境若启用了
suppress_php_warnings: true,PHP 警告不会进日志——这不是 Monolog 问题,是 Symfony 层提前吞掉了
main channel 的 handlers 只含 console(开发环境)或 nested(生产)var/log/prod.log 看似存在,其实是 kernel.terminate 阶段 flush 出来的,且仅限部分错误级别stream 或 rotating_file handlerconfig/packages/dev/monolog.yaml(开发)或 config/packages/prod/monolog.yaml(生产),在 handlers 下新增一个:
handlers:
file:
type: rotating_file
path: '%kernel.logs_dir%/app.log'
level: debug
max_files: 10
channels: ['!event', '!doctrine']
-
type: rotating_file比stream更实用:自动按日期切分(如app-2024-06-15.log),超max_files就删旧的 -
channels排除event和doctrine,避免日志爆炸(尤其开发时高频 event dispatch) - 不要设
level: info就以为能捕获所有请求——HTTP 请求日志默认走requestchannel,需显式加入channels列表
为什么日志写了但看不到内容?
常见现象:文件创建了,权限也对,但始终空或只有几行。
-
kernel.debug: false 时,debug 级别日志被全局过滤,即使 handler 设了 level: debug 也无效;必须同步调高 monolog.handlers.file.level 和 monolog.channels.main.level
-
channels 配置错位:handler 的 channels 是“这个 handler 处理哪些 channel”,不是“把哪些 channel 的日志塞进来”;漏写 main 就等于没接上主日志流
- 文件路径用了相对路径如
logs/app.log,实际会拼到项目根目录下,而非 var/logs/;务必用 '%kernel.logs_dir%/xxx.log'
Symfony 5.4 升 6.x 后 Monolog 配置失效?
不是失效,是结构变了:v6 强制要求每个 handler 显式声明 channels,且不再支持顶层 handlers 直接挂到 main。
- 旧写法:
handlers: [console, file] → 新写法必须拆成独立 handler 块,并在 handlers 下明确定义
-
rotating_file 的 filename_format 参数被移除,格式固定为 {filename}-{date}.{extension},想改命名得自定义 handler 类
- 生产环境若启用了
suppress_php_warnings: true,PHP 警告不会进日志——这不是 Monolog 问题,是 Symfony 层提前吞掉了
kernel.debug: false 时,debug 级别日志被全局过滤,即使 handler 设了 level: debug 也无效;必须同步调高 monolog.handlers.file.level 和 monolog.channels.main.level
channels 配置错位:handler 的 channels 是“这个 handler 处理哪些 channel”,不是“把哪些 channel 的日志塞进来”;漏写 main 就等于没接上主日志流logs/app.log,实际会拼到项目根目录下,而非 var/logs/;务必用 '%kernel.logs_dir%/xxx.log'
channels,且不再支持顶层 handlers 直接挂到 main。
- 旧写法:
handlers: [console, file]→ 新写法必须拆成独立 handler 块,并在handlers下明确定义 -
rotating_file的filename_format参数被移除,格式固定为{filename}-{date}.{extension},想改命名得自定义 handler 类 - 生产环境若启用了
suppress_php_warnings: true,PHP 警告不会进日志——这不是 Monolog 问题,是 Symfony 层提前吞掉了
日志路径、channel 绑定、debug 开关这三处只要有一处没对齐,就会静默丢日志。比写错语法更难查。


















