我们正在将Spring MVC 3用于WebApplication。我从应用程序中看到了一个奇怪的行为。当用户执行操作时(例如:单击按钮),我看到控制器日志被记录两次,控制器中的后续调用也是如此。我们使用的控制器是默认的,单例。 所以,
我想在控制器中打印线程信息(比如threadName。尝试过Thread.getName()..是唯一的)..有什么帮助吗?
如何确保只有一个Spring容器 装? - 任何建议?
log4j道具:
`log4j.appender.ROLL_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLL_FILE.File=/ws/was/dept/logs/${module.jvm.instance}_module.log
log4j.appender.ROLLING_FILE.Append=true
log4j.additivity.ROLLING_FILE.Append=false
log4j.appender.ROLLING_FILE.MaxFileSize=10MB
log4j.appender.ROLLING_FILE.MaxBackupIndex=20
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[module] %d - %c -%-4r [%t] %-5p %c %x - %m
Web.xml:
<display-name>module</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/spring/int/root-int-context.xml,/WEB-INF/spring/root- context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>`
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
..........
.........
.........
由于
答案 0 :(得分:1)
Thread.getId()
获取唯一的线程ID。log4j
或slfj
- 你可能有多个记录器拦截消息,在父记录中定义的appender上添加了appender记录器这可能会导致打印两条消息 - 因此请检查是否有这样的消息,并将additivity
定义为假。答案 1 :(得分:0)
我想在控制器中打印线程信息(比如threadName。试过Thread.getName()..是唯一的)
如何确保只加载了一个Spring容器?
我真的不明白你的意思,但如果你的web.xml中已经正确定义了contextConfigLocation,那么Spring容器就会被正确加载
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/META-INF/spring/*.xml
</param-value>