SpringMVC中配置Log4j日志到指定目录

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>
赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏