symfony默认不写日志文件,需手动配置monolog:一、添加rotating_file处理器使日志按天轮转;二、定义payment等独立通道并绑定专属文件;三、通过服务标签自动注入对应logger;四、排查debug过滤、路径错误及channels遗漏等问题。

Symfony 默认不把日志写进文件,开发环境只输出到控制台,var/log/dev.log 为空是正常现象。想让日志真正落盘、按天轮转、分通道管理,得手动配 Monolog 的处理器和通道。
一、让日志写入文件(基础配置)
默认的 console handler 不会写文件。要生成 app.log 并自动按日期切分,需在对应环境配置中添加 rotating_file 处理器:
- 编辑
config/packages/dev/monolog.yaml(开发)或config/packages/prod/monolog.yaml(生产) - 在
handlers:下新增一个处理器,例如:
file: type: rotating_file path: '%kernel.logs_dir%/app.log' level: debug max_files: 10 channels: ['!event', '!doctrine']
注意:channels 这里表示“该处理器处理哪些通道”,不是“把哪些通道塞进来”。漏掉 main 就等于没接上主日志流;排除 event 和 doctrine 是为了防止日志爆炸。
二、为不同业务建独立日志通道
支付、用户操作、API 请求等日志混在一起难排查?可以拆成多个通道,各自写入专属文件:
- 在
config/packages/monolog.yaml中声明通道名:channels: ['payment', 'user', 'api'] - 为每个通道定义专用处理器,比如:
payment: type: stream path: '%kernel.logs_dir%/payment.log' level: info channels: ['payment']
- 在服务或控制器中获取对应 Logger:
$this->get('monolog.logger.payment') - 调用
$logger->info('Order #123 paid'),内容就只进payment.log
三、自动注入通道 Logger(免手动获取)
不想每次用 $this->get()?给服务打标签,容器会自动注入匹配通道的 Logger:
- 在
config/services.yaml中定位服务,例如App\Service\PaymentService: - 加标签:
tags: [{ name: monolog.logger, channel: payment }] - 服务构造函数中写:
public function __construct(LoggerInterface $logger) - 容器自动注入
monolog.logger.payment实例,开箱即用
四、常见问题快速排查
日志写了但看不到内容?可能卡在这几个地方:
-
kernel.debug: false时,debug 级别日志会被全局过滤——要同步调高monolog.handlers.file.level和monolog.channels.main.level - 路径写成
logs/app.log是错的,必须用'%kernel.logs_dir%/app.log',否则日志会写到项目根目录 - Symfony 6+ 要求每个 handler 显式声明
channels,不能再用旧写法handlers: [console, file] - HTTP 请求日志走的是
request通道,如果想记录,得把它加进 handler 的channels列表里











