Log4j+Spring配置

 

    现在的公司项目原有的log4j是采用的最传统的方式,即在classpath下面新建一个log4j.properties文件,待Tomcat启动的时候log4j.jar会自动扫描这个路径,如果发现这个文件,则加载它,如果没有,打印警告信息并采用默认配置。 这样的配置应该是最简单的,但却很难实现一些比较实在的需求,比如日志输出文件路径采用相对路径,对日志配置文件的监听和动态加载。


    Spring看到了这些需求,发挥其无所不包的特性,对log4做了封装,实现了上述的功能。具体配置如下:
    在web.xml 添加

    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>webName.root</param-value>
    </context-param>
    <context-param>
  <param-name>log4jExposeWebAppRoot</param-name>
  <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>WEB-INF/log4j.properties</param-value>
    </context-param>

    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>60000</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

  1. 这里的webAppRootKey是保存整个web应用的相对路径的Key,在你的log4j.properties文件中引用这个路径的时候只需要类似 ${webName.root}就可以了,
  2. log4jExposeWebAppRoot则是表示是否需要把Web应用的根路径导出到webAppRootKey中
  3. log4jConfigLocation,没的说,你的配置文件,这里之所以要你指明,还是有一点玄机的
  4. log4jRefreshInterval,对日志配置文件的监听线程刷新间隔,毫秒为单位
  5. org.springframework.web.util.Log4jConfigListener,上述的context-param最终都是被这个Listener读取并借此初始化以及动态修改log4j配置的

配置算是相当简单了,但 有两个需要值得注意的地方

  1. webAppRootKey不是必须的,如果不填,会自动默认会webapp.root,但如果你有多个web应用运行在同一个JVM中,则必须要指定,不然大家都是webapp.root,所有的webapp.root会指向JVM加载的最后一个web应用的根路径。
  2. log4jConfigLocation这个路径很重要,如果直接沿用传统的方式的路径,WEB-INF/classes/log4j.properties或者classpath:log4j.properties,虽然一样能加载,但是由于log4j自身会自动扫描这个路径,所以应用启动的时候会先抛出多个找不到路径的异常(java.io.FileNotFoundException:),因为你所指定的,根据${webapp.root}来的相对路径log4j本身是不认识的。

0 评论: