log4j configuration in spring application
很久没使用log4j,一直都使用的是logback,记得之前使用log4j的时候,需要自己写个log4jInit的辅助类来帮助初始化log4j的配置文件,现在发现spring已经提供了各种支持,所以在此记录下。以前的老土方式可以放弃了(貌似spring很早就提供了,自己土了)
做个广告,logback是不需要这个辅助类的,因为他是依据文件名自己搜索初始化的,而且还有个默认的初始化。(非常喜欢logback)
说下spring里配置log4j的方式吧:
第一种方式:类似自己写个log4J的初始化辅助类,指定classpath中的文件即可,不管是xml还是properties都可以,因为他内部有做判断的。
<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetClass" value="org.springframework.util.Log4jConfigurer" /> <property name="targetMethod" value="initLogging" /> <property name="arguments"> <list> <value>classpath:log4j.xml</value> </list> </property> </bean>
第二种方式:其实主要原理是servlet中listener的使用
<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>1000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
看下他这里有个 log4jRefreshInterval参数,内部调用的是PropertyWatchdog ,这个起的作用就是动态来观察配置文件是否修改,修改了以后重新初始化配置,jboss里的log也是依据这个来动态修改level起作用的。如果你可以修改这个文件,那使用这个方式最好了。因为第一个方式一般会在jar包了。当然第一个方式也可以修改为动态观察日志的方式了,因为spring内部重载了那个方法,只是多加了个参数而已。
参考:http://firstpartners.net/kb/index.php/Spring_Pointer_to_Log4j_Configuration_File
http://helpdesk.objects.com.au/java/how-to-specify-log4j-configuration-in-spring-application