Symfony5.4+Monolog3.8:CitiesController日志未写入指定文件问题
解决CitiesController日志未写入指定文件的问题
1. 确保控制器使用指定通道的日志器
默认注入的logger服务对应main通道,要写入cities_controller通道,得用对应通道的日志器:
构造函数注入方式
在CitiesController里注入专属日志器,Symfony会自动识别monolog.logger.cities_controller服务:
// src/Controller/CitiesController.php namespace App\Controller; use Psr\Log\LoggerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class CitiesController extends AbstractController { private $logger; public function __construct(LoggerInterface $citiesControllerLogger) { $this->logger = $citiesControllerLogger; } #[Route('/cities', name: 'app_cities')] public function index(): Response { $this->logger->info('处理城市列表请求'); return $this->render('cities/index.html.twig'); } }
直接调用指定通道日志器
如果不想修改构造函数,也可以直接获取对应服务:
$this->get('monolog.logger.cities_controller')->info('处理城市列表请求');
2. 调整配置避免日志重复输出
当前main处理器的channels是["!event"],会处理包括cities_controller在内的所有非event通道日志,导致日志同时出现在dev.log和目标文件。若想让日志仅写入指定文件,给main处理器添加排除规则:
when@dev: monolog: handlers: main: type: stream path: "%kernel.logs_dir%/%kernel.environment%.log" level: debug channels: ["!event", "!cities_controller"] # 新增排除cities_controller cities_controller_log: type: stream path: "%kernel.logs_dir%/CitiesController.log" level: debug channels: ['cities_controller'] # 其他处理器配置保持不变
3. 验证配置生效
- 清除缓存:执行
php bin/console cache:clear - 访问CitiesController的路由触发日志
- 检查
var/logs/CitiesController.log是否生成并包含日志内容
若仍未生成,排查以下点:
- 确认
var/logs目录有写入权限 - 确保调用的日志方法(如info、debug)级别不低于配置的
level: debug
内容的提问来源于stack exchange,提问作者Nadir
相关产品推荐
相关产品推荐

