在实际开发项目中,大部分产品的日志级别是ERROR级别的,因为这样可以提升系统运行效率,也可以防止INFO日志过多,日志文件很快被写满,以至于系统不能保存长时间的日志。进而造成定位问题不方便。
但是在ERROR级别下可能无法看到系统运行的详细日志信息。有时候需要查看INFO日志。所以最好有一种方法可以在系统运行过程中,动态修改日志级别。
实现动态修改日志级别,有两种办法:
1、利用Log4j提供的类和方法
2、自己实现监控log4j.xml文件更新,并实现动态配置更新。
一、利用Log4j提供的动态配置更新方法实现动态修改日志级别。
调用PropertyConfigurator或者DOMConfigurator类的configureAndWatch(String configFileName)或者configureAndWatch(String configFileName,long delay)
走读Log4j DOMConfigurator类configureAndWatch方法源码,发现只要是调用configureAndWatch()方法,Log4j就会启动一个线程,根据入参delay或者默认的1分钟时间周期扫描指定的log4j.xml文件的更新情况,如果发现有更新则重新加载log4j.xml配置。
代码示例:
import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; /** * */ /** * @author Administrator * */ public class LogConfigurator { private static Logger logger = Logger.getLogger(LogConfigurator.class); /** * @param args */ public static void main(String[] args) { DOMConfigurator.configureAndWatch("d:\\log4j\\log4j.xml", 5000L); while (true) { try { logger.info("hello-Info"); logger.debug("hello-Debug"); logger.error("hello-Error"); Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } } } }
在D盘,Log4j文件夹下创建log4j.xml文件。内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- 类似定义logger节点打印具体类,或某包中的指定级别以上日志 --> <logger name="LogConfigurator"> <level value="info" /> [color=red] <appender-ref ref="console" /> [/color] </logger> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[DomConfigurator Test][%d{ABSOLUTE}][%-5p][%m]%n" /> </layout> </appender> </log4j:configuration>
运行LogConfigurator的main方法,并随时修改D:\log4j\log4j.xml文件中定义的日志级别。
<level value="info" />
观察控制台打印的日志级别。