Spring和SpringMVC的包引用等基本工作省略,直接切入正题,配置log4j的路径方式有很多,有在tomcat中配置,有在自定义过滤器,自定义拦截器中配置过,但是Spring提供了一个拦截器,那就使用它把,配置简单,这里说一下Log4jConfigListener和WebAppRootListener配置log4j方式
Log4jConfigListener方式
web.xml如下,使用这种方式可以指定log4j.properties文件位置
<context-param> <param-name>webAppRootKey</param-name> <param-value>webapp.root</param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:config/log4j.properties</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
查看Log4jConfigListener类源码发现这个类过时了
/** * @deprecated Class Log4jConfigListener is deprecated */ public class Log4jConfigListener implements ServletContextListener { public Log4jConfigListener() { } public void contextInitialized(ServletContextEvent event) { Log4jWebConfigurer.initLogging(event.getServletContext()); } public void contextDestroyed(ServletContextEvent event) { Log4jWebConfigurer.shutdownLogging(event.getServletContext()); } }
其中Log4jWebConfigurer.java中,有这么一段代码,用于获取log4j.properties文件路径的
String location = servletContext.getInitParameter("log4jConfigLocation");
WebAppRootListener方式
<context-param> <param-name>webAppRootKey</param-name> <param-value>webapp.root</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.WebAppRootListener</listener-class> </listener>
这种配置方式源码虽然官方中并没有注释过时标识,但是查看源码中发现WebUtils.java中并没有处理可以指定log4j.properties的参数,所以一般默认情况放在classpath中,用这个还是可以的,但是如果使用了Log4jConfigListener.java,那么它的配置是可以代替WebAppRootListener内容的
public class WebAppRootListener implements ServletContextListener { public WebAppRootListener() { } public void contextInitialized(ServletContextEvent event) { WebUtils.setWebAppRootSystemProperty(event.getServletContext()); } public void contextDestroyed(ServletContextEvent event) { WebUtils.removeWebAppRootSystemProperty(event.getServletContext()); } }
log4j.properties配置
log4j.rootLogger=info, console, info, error log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[youcl][%x] %-4d{HH\:mm\:ss} %-5p %c[%L] - %m%n log4j.appender.info.encoding=UTF-8 log4j.appender.info=org.apache.log4j.DailyRollingFileAppender log4j.appender.info.Append=true log4j.appender.info.Threshold = INFO log4j.appender.info.layout=org.apache.log4j.PatternLayout log4j.appender.info.DatePattern='.'yyyy-MM-dd log4j.appender.info.layout.ConversionPattern=[youcl][%x] %-4d{HH\:mm\:ss} %-5p %c[%L] - %m%n log4j.appender.info.File=${webapp.root}/WEB-INF/logs/info.log log4j.appender.error.encoding=UTF-8 log4j.appender.error=org.apache.log4j.DailyRollingFileAppender log4j.appender.error.Append=true log4j.appender.error.Threshold = ERROR log4j.appender.error.DatePattern='.'yyyy-MM-dd log4j.appender.error.layout=org.apache.log4j.PatternLayout log4j.appender.error.layout.ConversionPattern=[youcl][%x] %-4d{HH\:mm\:ss} %-5p %c[%L] - %m%n log4j.appender.error.File=${webapp.root}/WEB-INF/logs/error.log
总结
上面的两个监听器都会在web上下文初始化的时候,调用webUtil的对应方法,首先获取到param-name对应的param-value ,然后,根据传递进去的ServletContext对象得到web的物理路径:String root = servletContext.getRealPath("/");这样在log4j.properties中就可以直接使用${webapp.root}指定项目路径了
注意点
webUtil的webAppRootKey参数默认值是webapp.root,所以如果是多个项目的话,建议配置不同的值,避免冲突,比如
项目1
<context-param> <param-name>webAppRootKey</param-name> <param-value>project1</param-value> </context-param>
项目2
<context-param> <param-name>webAppRootKey</param-name> <param-value>project2</param-value> </context-param>