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); } } }
注:以上代码是参考自某位仁兄的信息,但忘记了来源出处,所以很抱歉,无法说明转载出处。