若日志未按预期写入或通道分离失败,需检查Monolog配置:一、配置rotating_file处理器实现按日期轮转与清理;二、声明独立通道并绑定专用处理器;三、用monolog.logger标签自动注入Logger;四、通过参数动态注册额外通道。

如果您在Symfony项目中需要记录运行时信息,但日志未按预期写入文件或通道分离失败,则可能是Monolog配置未正确生效或通道绑定缺失。以下是配置Monolog日志的具体方法:
一、配置基础文件日志处理器
此方法用于将日志统一写入指定路径的轮转文件,避免单文件无限增长,并支持自动按日期切分与旧日志清理。
1、打开对应环境配置文件:config/packages/dev/monolog.yaml(开发环境) 或 config/packages/prod/monolog.yaml(生产环境)。
2、在 handlers: 下新增一个名为 file 的处理器定义。
3、设置 type: rotating_file,指定 path: '%kernel.logs_dir%/app.log',并设定 level: debug 以捕获全部调试级别日志。
4、添加 max_files: 10 控制保留最多10个历史日志文件,超出则自动删除最旧文件。
5、通过 channels: ['!event', '!doctrine'] 排除高频事件与Doctrine日志,防止日志体积失控。
二、为不同模块创建独立日志通道
此方法实现业务逻辑隔离,使支付、用户操作、API请求等日志分别写入专属文件,便于定位问题与审计追踪。
1、在 config/packages/monolog.yaml 中声明所需通道名称,例如:channels: ['payment', 'user', 'api']。
2、为每个通道定义专用处理器,如 payment: 使用 type: stream 并指向 path: '%kernel.logs_dir%/payment.log'。
3、确保该处理器的 channels: 仅包含对应通道名,例如 [payment]。
4、在控制器或服务中注入对应通道的Logger实例,例如通过 $this->get('monolog.logger.payment') 获取。
5、调用 $logger->info('Payment processed') 即可写入 payment.log。
三、通过服务标签自动绑定日志通道
此方法免去手动获取Logger实例的步骤,由容器在服务实例化时自动注入匹配通道的Logger,适合高内聚服务类。
1、在 config/services.yaml 中定位目标服务定义,例如 App\Service\PaymentService:。
2、为其添加标签:tags: - { name: monolog.logger, channel: payment }。
3、确认 MonologBundle 已启用且 LoggerChannelPass 编译器已运行(默认启用)。
4、在该服务构造函数中声明类型提示:public function __construct(LoggerInterface $logger)。
5、容器将自动注入 monolog.logger.payment 实例,无需额外配置即可使用。
四、动态注册额外日志通道
此方法适用于需在运行前批量启用通道但不修改主配置文件的场景,例如集成第三方模块时按需加载审计通道。
1、在 config/services.yaml 的 parameters: 区域下添加:monolog.additional_channels: ['audit', 'debug']。
2、确保这些通道名未在 monolog.channels 中重复声明,否则会触发配置冲突。
3、为新通道定义处理器时,仍需在 handlers: 中显式配置,且 channels: 必须精确匹配参数中声明的名称。
4、通道服务(如 monolog.logger.audit)将在容器编译阶段由 LoggerChannelPass::process() 自动创建。
5、在任意服务中通过 $this->get('monolog.logger.audit') 获取实例并调用日志方法。

















