dev环境下日志不实时打印访问路径,主因是console handler未启用或level设为高于debug;需确认app_debug=1、monolog中console处理器启用process_psr_3_messages并设verbosity_levels,且handlers.main包含main通道。

dev 环境下日志不实时打印访问路径,基本是因为 monolog 的 console handler 没启用或 level 设太高——debug 级别才能捕获路由匹配、控制器调用等关键路径信息。
确认 dev 环境是否真在 debug 模式
即使 .env 里写了 APP_ENV=dev,如果 APP_DEBUG=0 或没生效,Symfony 会强制把日志降级为 warning,debug() 调用直接被丢弃。
- 运行
php bin/console about,检查输出中Debug mode是否为yes - 在控制器里加一行
dump($this->getParameter('kernel.debug')),必须返回true - 检查
config/packages/dev/monolog.yaml中level是否明确设为debug,不能只依赖全局默认值
让 console handler 显示请求路径的最小配置
默认的 console handler 不会自动记录 HTTP 请求路径;必须显式启用 process_psr_3_messages: true 并配合 verbosity_levels 才能将 debug 级别日志输出到终端。
- 编辑
config/packages/dev/monolog.yaml,确保包含以下内容:
handlers:
console:
type: console
process_psr_3_messages: true
verbosity_levels:
VERBOSITY_VERBOSE: debug
VERBOSITY_VERY_VERBOSE: debug
- 启动服务器后,用
php -S localhost:8000 -t public -d display_errors=1运行,避免 CLI 输出被缓冲 - 访问
http://localhost:8000/any-path,终端应立即出现类似[2026-08-13T13:52:01.123456+00:00] app.DEBUG: Matched route "app_homepage". {"route":"app_homepage"} []的行
手动埋点记录当前请求路径(不依赖框架自动日志)
框架自动日志可能被过滤或延迟,最稳的方式是在控制器入口主动记录,且带上结构化上下文。
- 注入
RequestStack和LoggerInterface:
use Symfony\Component\HttpFoundation\RequestStack;
use Psr\Log\LoggerInterface;
public function index(RequestStack $requestStack, LoggerInterface $logger)
{
$request = $requestStack->getCurrentRequest();
$logger->debug('Request path', [
'path' => $request->getPathInfo(),
'method' => $request->getMethod(),
'route' => $request->attributes->get('_route'),
'query' => $request->query->all(),
]);
return $this->render('base.html.twig');
}
- 注意:不要用
$request->getUri(),它可能含 host 和 query,而getPathInfo()才是真正被路由匹配的路径 - 若
$requestStack->getCurrentRequest()返回 null,说明不在 HTTP 上下文(比如命令行调用),需加判空
tail -f dev.log 看不到新日志?先查这三处
var/log/dev.log 空或不更新,90% 是权限、路径或通道配置问题,不是代码逻辑错误。
- 执行
ls -ld var/log,确认 web 服务器用户(如www-data)对该目录有w权限;否则日志写入失败但无报错 - 运行
php bin/console debug:container --parameter=kernel.logs_dir,输出必须是var/log;若为空,说明Kernel初始化异常,monolog 根本没加载 - 检查
config/packages/dev/monolog.yaml中handlers.main.channels是否漏掉了main—— 如果写成channels: ['!event']却没显式包含main,日志就进不了文件
路径和权限对了,tail -f var/log/dev.log 就能实时看到每次请求的完整路径、控制器名、模板渲染耗时——这才是本地调试最可靠的依据。别信“应该有”,得亲眼看见那行 Matched route 才算真通。











