Log4j是什么不多说了,平时我们在项目中使用log4j时,日志输出级别,一般都是预定义在定义文件里的,但问题在于,如果系统发生了错误,我们希望可以看到更多的信息,以确定错误发生的原因。大部分情况下,我们的做法了,停掉系统,修改log4j的输出级别,例如从info改到debug,然后再试着去重现错误。然后悲剧发生了,发现错误就是不出来,总不能系统一直在debug状态下运行吧,除非你真的完全不在乎性能问题。
遇到以上情况,其实只要我们在系统里多实现一个小的辅助功能,当系统发生错误时,可以动态修改log4j的日志输出级别就可以了。
public class Log4jTest {
private static Log log = LogFactory.getLog(Log4jTest.class);
public static void main(String[] args) {
log.info("hello1");
log.debug("world1");
log.error("Baby1");
changeLevel("DEBUG");
log.info("hello2");
log.debug("world2");
log.error("Baby2");
changeLevel("ERROR");
log.info("hello3");
log.debug("world3");
log.error("Baby3");
}
public static void changeLevel(String value) {
final String sArg = LogManager.getRootLogger().getLevel().toString();
if (sArg.equals(value)) return;
final Level level = Level.toLevel(value);
// 设置根日志级别
LogManager.getRootLogger().setLevel(level);
// 获取配置文件中的所有log4j对象
final Enumeration<Logger> logs = LogManager.getCurrentLoggers();
while (logs.hasMoreElements()) {
final Logger logger = logs.nextElement();
// 给log4j对象设置级别
logger.setLevel(level);
}
}
}
注:以上代码是参考自某位仁兄的信息,但忘记了来源出处,所以很抱歉,无法说明转载出处。