0

我试图使用打印到控制台的日志来查看 Spring 框架内的执行流程。目的是稍微了解 Spring 框架的内部工作原理。我在我的应用程序中将日志记录级别设置为 ALL。以下行打印在日志中:

2013-07-04 14:46:34 TRACE DispatcherServlet:1018 - Bound request context to thread: org.apache.catalina.connector.RequestFacade@13dd208
2013-07-04 14:46:34 DEBUG DispatcherServlet:823 - DispatcherServlet with name 'web' processing GET request for [/webtemplate/]
2013-07-04 14:46:34 TRACE DispatcherServlet:1088 - Testing handler map [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@fedfb6] in DispatcherServlet with name 'web'
2013-07-04 14:46:34 DEBUG RequestMappingHandlerMapping:220 - Looking up handler method for path /
2013-07-04 14:46:34 TRACE RequestMappingHandlerMapping:264 - Found 1 matching mapping(s) for [/] : [{[/],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}]
2013-07-04 14:46:34 DEBUG RequestMappingHandlerMapping:227 - Returning handler method [public java.lang.String com.lister.custom.webtemplate.controller.MainController.index(org.springframework.ui.ModelMap)]
2013-07-04 14:46:34 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'mainController'
2013-07-04 14:46:34 TRACE DispatcherServlet:1122 - Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@771eb1]

我检查了源文件(?)和所有行中打印的行号:

  • DispatcherServlet:823
  • DispatcherServlet:1018
  • 请求映射处理程序映射:220
  • ETC...

试图看看里面发生了什么。

但是,在大多数情况下,我无法在相应的行号中找到任何相关代码。许多人只是对这些行号发表了评论。

在上述日志行中,只有DispatcherServlet:823打印日志的实际代码。

如何使用日志(DEBUG 和 TRACE)来跟踪 Spring 内部的执行流程?

笔记:

  • 我的应用程序使用的二进制文件和我正在检查的源的版本是相同的 - 3.2.3.RELEASE

  • 以下是我的记录器模式:log4j.appender.console.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n如果有帮助。

4

1 回答 1

0

您还需要检查超类。例如:

2013-07-04 14:46:34 TRACE DispatcherServlet:1018 - Bound request context to thread: org.apache.catalina.connector.RequestFacade@13dd208

实际上是由 FrameworkServlet 类第 1018 行制作的。

也许你应该配置你的 log4j 记录器来吐出完全限定的类名(不仅仅是记录器名):

%d{yyyy-MM-dd HH:mm:ss} %-5p %C{1}:%L - %m%n

(注意大写 C 而不是 c)

于 2013-07-05T04:28:26.203 回答