在实际开发项目中,大部分产品的日志级别是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" />
观察控制台打印的日志级别。