欢迎和你们交流技术相关问题:
邮箱: jiangxinnju@163.com
博客园地址: http://www.cnblogs.com/jiangxinnju
GitHub地址: https://github.com/jiangxincode
知乎地址: https://www.zhihu.com/people/jiangxinnjujava
作一个产品或者项目,在测试时通常要打印详细的log,发布之后,由于打印日志会损失性能,因此一般在生产机上将log4j级别设置为最高,以提升效率,一旦客户那里出了问题,须要查看详细的日志信息来跟踪问题,此时打印日志就是很重要的事情。这就须要在应用开发不重启的状况下,动态切换log4j日志策略了。git
目前有两种方式能够实现热切换Log4j级别配置,一是定时刷新log4j配置文件,二是调用setlevel()动态设置。github
使用log4j自带的动态更新配置很简单,只要调用 PropertyConfigurator 或者 DOMConfigurator类的 configureAndWatch(String configFileName)或者 configureAndWatch(String configFileName, long delay)方法就能够了。其中configFileName值配置文件的路径加文件名,delay指扫描配置文件是否改变的间隔时间,默认值是 60 秒。在调用时log4j会建立一个线程,定时的去检查配置文件是否改变,若是改变的话就从新加载配置文件。须要注意的是在log4j中每调用一次configureAndWatch方法都会启动一个新的扫描线程,web
实例代码参考:Log4jHotChangeWatchdogspring
咱们能够经过configureAndWatch方法来进行动态的改变log4j的配置,可是他采用了轮询方式来实现的,如今咱们须要某种触发机制本身调用PropertyConfigurator对象的configure(String configFilename)方法从新加载log4j的配置。触发机制须要联系实际业务,若是是一个web应用,就经过页面来调用。若是是WebService应用,就使用开发的服务来调用。jsp
实例代码参考:log4jReload.jsp性能
spring经过org.springframework.util. Log4jConfigListener实现运行时切换需求,Log4jConfigListener对log4j原生方法进行封装。默认状况是1分钟从新加载一次。测试
在web.xml文件中 配置 加载 log4j.properties的属性线程
<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>10000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<!-- 为避免项目间冲突,定义惟一的 webAppRootKey -->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>scheduleProject</param-value>
</context-param>
①log4jConfigLocation 指定Spring从哪一个目录下加载 log4j.properties 配置文件
②log4jRefreshInterval 当修改了配置文件时,不须要重启就能加载变化了的log4j.properties 配置文件
③webAppRootKey 项目的标识,一个窗口中可能部署了多个项目,用它进行区分。当配置日志文件的输出目录时,可能会用到它。
经过本身作的web界面,客户在前台设置日志级别,后台调用logger.setlevel()来完成日志级别切换,可是这有个缺点,下次服务重启后,本次的日志级别调整持久保存下来。
实例代码参考:log4jHotChange.jsp
若是使用spring和jmx会很简单
实例代码参考:Log4jHotChangeMBean