我正在使用非常简单的代码运行Vaadin Servlet,我想在应用程序启动/结束时使用Log4j进行登录,并且对于客户端的会话也是如此。但是,只有一些记录的消息最终会写入日志文件本身。
servlet的代码如下:
@WebServlet(value = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = MyVaadinUI.class, widgetset = "som.vaadin.AppWidgetSet")
public static class Servlet extends VaadinServlet implements SessionInitListener, SessionDestroyListener {
private static final Logger LOGGER = LogManager.getLogger(Servlet.class);
@Override
protected void servletInitialized() throws ServletException {
super.servletInitialized();
LOGGER.info("App started");
getService().addSessionInitListener(this);
getService().addSessionDestroyListener(this);
}
@Override
public void destroy() {
LOGGER.info("App stopped");
super.destroy();
}
@Override
public void sessionInit(SessionInitEvent event) {
LOGGER.info("Session started");
}
@Override
public void sessionDestroy(SessionDestroyEvent event) {
LOGGER.info("Session expired");
}
}
我的log4j日志配置文件如下:
log4j.rootLogger=DEBUG, console, RollingAppender
log4j.appender.RollingAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingAppender.File=c:/temp/log/error_som.log
log4j.appender.RollingAppender.DatePattern='.'yyyy-ww
log4j.appender.RollingAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingAppender.layout.ConversionPattern= [%d{ISO8601}] %5p%6.6r[%t]%x(%F:%L) - %m%n
最后,我在日志文件中得到的只是:
[2015-06-09 14:17:18,197] INFO 6042(MainBusiness.java:122) - 应用已开始
我已通过调试检查调用了sessionInit(),并且还执行了其中的LOGGER.info()调用。但是,log4j Appender只接收了与servletInitialized()函数对应的消息。
有关可能发生的事情的任何想法吗?
谢谢, 克里斯
答案 0 :(得分:0)
最后,我得到了正在发生的事情。虽然,我无法理解。
问题是由上面代码中显示的注释中的servlet配置和init-params冲突以及web.xml的内容引起的。 VaadinServlet定义了两次,具有不同的配置,包括log4j库的配置文件。有时候,servlet正在使用一个,有时它正在使用另一个,甚至在同一个对象中!
所以,我解决了它,但我不明白为什么它真的发生了。