【问题标题】:Debugging Spring configuration调试 Spring 配置
【发布时间】:2011-12-12 00:14:17
【问题描述】:

我正在开发一个使用 Spring 和 Hibernate 并在 Websphere 上运行的 Java 应用程序。 我遇到了一个问题,我希望 Spring 将 Dao 加载到我的对象中,但由于某种原因这并没有发生。 (以几乎相同的方式指定的另一个 Dao 加载正常。)

问题是 - 我如何调试 Spring 如何决定加载什么? 我可以为 Spring 开启日志记录吗?在哪里开启?

【问题讨论】:

    标签: java hibernate spring configuration websphere


    【解决方案1】:

    如果您使用 Spring Boot,您还可以通过使用 --debug 标志启动应用程序来启用“调试”模式。

    java -jar myapp.jar --debug
    

    您还可以在 application.properties 中指定 debug=true。

    启用调试模式后,会配置一系列核心记录器(嵌入式容器、Hibernate 和 Spring Boot)以输出更多信息。启用调试模式不会将您的应用程序配置为记录所有带有 DEBUG 级别的消息。

    或者,您可以通过使用 --trace 标志(或 application.properties 中的 trace=true)启动应用程序来启用“跟踪”模式。这样做可以为选择的核心记录器(嵌入式容器、Hibernate 模式生成和整个 Spring 产品组合)启用跟踪日志记录。

    https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html

    【讨论】:

      【解决方案2】:

      是的,Spring 框架日志记录非常详细,您在帖子中没有提到您是否已经在使用日志框架。如果您使用的是 log4j,那么只需将 spring appenders 添加到 log4j 配置(即 log4j.xml 或 log4j.properties),如果您使用的是 log4j xml 配置,您可以执行类似的操作

      <category name="org.springframework.beans">
          <priority value="debug" />
      </category>
      

      <category name="org.springframework">
          <priority value="debug" />
      </category>
      

      我建议您使用 JUnit 测试单独测试此问题,您可以通过将 spring testing moduleJunit 结合使用来完成此操作。如果您使用 spring 测试模块,它将为您完成大部分工作,它会根据您的上下文配置加载上下文文件并启动容器,这样您就可以专注于测试您的业务逻辑。我这里有一个小例子

      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(locations={"classpath:springContext.xml"})
      @Transactional
      public class SpringDAOTest 
      {
          @Autowired
          private SpringDAO dao;
      
          @Autowired
          private ApplicationContext appContext;
      
          @Test
          public void checkConfig()
          {
              AnySpringBean bean =  appContext.getBean(AnySpringBean.class);
              Assert.assertNotNull(bean);
          }
      }
      

      更新

      我不建议您更改加载日志记录的方式,而是在您的开发环境中尝试此操作,将此 sn-p 添加到您的 web.xml 文件中

      <context-param>
          <param-name>log4jConfigLocation</param-name>
          <param-value>/WEB-INF/log4j.xml</param-value>
      </context-param>
      
      <listener>
          <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
      </listener>
      

      更新 log4j 配置文件


      我在本地 tomcat 上对此进行了测试,它在应用程序启动时生成了大量日志记录。我还想更正一下:使用 debug 而不是 info 正如@Rayan Stewart 提到的那样。

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
      
      <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
          <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
              <param name="Threshold" value="debug" />
              <layout class="org.apache.log4j.PatternLayout">
                  <param name="ConversionPattern"
                      value="%d{HH:mm:ss} %p [%t]:%c{3}.%M()%L - %m%n" />
              </layout>
          </appender>
      
          <appender name="springAppender" class="org.apache.log4j.RollingFileAppender"> 
              <param name="file" value="C:/tomcatLogs/webApp/spring-details.log" /> 
              <param name="append" value="true" /> 
              <layout class="org.apache.log4j.PatternLayout">
                  <param name="ConversionPattern"
                      value="%d{MM/dd/yyyy HH:mm:ss}  [%t]:%c{5}.%M()%L %m%n" />
              </layout>
          </appender>
      
          <category name="org.springframework">
              <priority value="debug" />
          </category>
      
          <category name="org.springframework.beans">
              <priority value="debug" />
          </category>
      
          <category name="org.springframework.security">
              <priority value="debug" />
          </category>
      
          <category
              name="org.springframework.beans.CachedIntrospectionResults">
              <priority value="debug" />
          </category>
      
          <category name="org.springframework.jdbc.core">
              <priority value="debug" />
          </category>
      
          <category name="org.springframework.transaction.support.TransactionSynchronizationManager">
              <priority value="debug" />
          </category>
      
          <root>
              <priority value="debug" />
              <appender-ref ref="springAppender" />
              <!-- <appender-ref ref="STDOUT"/>  -->
          </root>
      </log4j:configuration>
      

      【讨论】:

      • +1:调试级别更适合跟踪此类问题。
      • 同意@RyanStewart。如果问题是缺少依赖项,您可能需要 DEBUG 级别来找出它的来源。
      • @PrasannaTalakanti 我将这些添加到 log4j.xml: 但是没有日志文件。
      • 你看到其他日志了吗?,你是如何加载你的 log4j 配置的(你使用的是 org.springframework.web.util.Log4jConfigListener)
      • @PrasannaTalakanti 是的,该文件中配置的其余日志记录有效。我应该在哪里引用 org.springframework.web.util.Log4jConfigListener ?
      猜你喜欢
      • 2016-04-21
      • 1970-01-01
      • 2020-09-08
      相关资源
      最近更新 更多