Symfony默认不记录HTTP请求路径到var/log/dev.log,需通过RequestLoggerListener监听KernelEvents::REQUEST事件,配合独立request通道和rotating_file处理器实现落盘;须过滤静态资源、敏感参数,并验证监听器注册、权限及环境配置。

var/log/dev.log 为空不是 bug,是 Symfony2 默认行为——它不自动把请求路径写进文件,只输出到 Web Profiler 或控制台。想让接口访问路径真正落盘、可检索、能监控,得手动配 Monolog + 拦截器,而不是靠开个 debug 就完事。
怎么让每个 HTTP 请求路径自动记进日志文件
别指望 monolog.yaml 里加个 stream 处理器就自动记录请求路径——Monolog 不知道 HTTP 是啥,它只收你主动 $logger->info() 的内容。必须用事件监听器或内核请求钩子来捕获。
- 在
src/EventListener/RequestLoggerListener.php中实现KernelEvents::REQUEST监听,获取$event->getRequest()->getUri()和$event->getRequest()->getMethod() - 注入
LoggerInterface(推荐用monolog.logger.request通道,避免污染app主通道) - 记录时带上关键上下文:
$logger->info('API access', ['uri' => $uri, 'method' => $method, 'ip' => $request->getClientIp()]) - 注意:不要在
KernelEvents::FINISH_REQUEST记录,否则异常请求(如 404、500)会漏掉
为什么用独立 channel 而不是直接往 app.log 写
混在 app.log 里查接口路径,等于大海捞针。一旦有 Doctrine 查询、EventDispatcher 日志一起刷屏,grep "GET /api/" 基本失效。
- 在
config/packages/monolog.yaml声明通道:channels: ['request'] - 配专属处理器:
request_handler,type: rotating_file,path: '%kernel.logs_dir%/request.log',channels: [request] - 确保该处理器没被环境配置覆盖——检查
config/packages/prod/monolog.yaml是否清空了channels列表 - 生产环境建议加
fingers_crossed包裹,避免健康请求刷爆磁盘:type: fingers_crossed+action_level: warning,只在出错时才 dump 全量请求链路
如何避免日志爆炸和性能拖慢
每请求都记完整 URI + query string + headers?很快撑爆磁盘,且 json_encode() 开销不小。
- 过滤敏感参数:
parse_url($uri, PHP_URL_PATH)取路径,parse_str($query, $parsed)后 unsettoken、password等键 - 跳过静态资源:
if (preg_match('/\.(js|css|png|jpg|woff2)$/', $path)) { return; } - 异步写入不可行(Monolog 不原生支持),但可用
buffer处理器降低 I/O 频次:type: buffer+handler: request_handler - 别在 dev 环境开全量记录——用
%kernel.environment% == 'prod'条件判断是否启用监听器
排查 request.log 没内容的三个硬检查点
写了监听器、配了 channel、也跑了 cache:clear,日志还是空?多半卡在这三处。
- 运行
bin/console debug:event-dispatcher kernel.request,确认你的监听器在列表里且优先级合理(建议priority: 8,比 SecurityListener 高但低于 RouterListener) - 执行
bin/console debug:container --parameter=kernel.logs_dir,看输出路径是不是真有写权限(ls -l var/log,确认 www-data 可写) - 临时在监听器里加
file_put_contents('/tmp/debug.log', "hit\n", FILE_APPEND),排除监听器根本没触发
request.log 推给 Logstash 或 Filebeat,再进 Elasticsearch。但第一步——让路径确实写进去、不丢、不混——必须手工抠准这四块配置,少一个环节,后面所有可视化都是空中楼阁。


















