Log4j调试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majian_1987/article/details/51274974
 log4j是项目中经常会使用到的一个日志框架,在使用的过程中,经常会遇到log4j配置文件冲突,或者打印出莫名其妙的日志信息。这时 我们就想要知道在当前环境中使用的是哪个log4j配置文件,或者我们想知道,在整个过程中,Log4j做了哪些事情。这时,就需要我们对Log4j进行 调试,打印出log4j的内部的日志信息。

    可是Log4j并不能使用Log4j本身输出内部的日志信息。在log4j内部提供了一个专门用于输出log4j日志的日志工具--LogLog。这个类用于从log4j包里面输出日志语句

   Log4j components cannot make log4j logging calls. However, it is
   sometimes useful for the user to learn about what log4j is
   doing. You can enable log4j internal logging by defining the
   log4j.configDebug variable.

由LogLog的文档说明上可以知道,我们可以通过设置系统属性log4j.configDebug=true来开启输出Log4j的日志,log4j.configDebug变量已经被废弃,现在使用log4j.debug替换。

    String value = properties.getProperty(LogLog.DEBUG_KEY);//LogLog.DEBUG_KEY --> log4j.debug
    if(value == null) {
      value = properties.getProperty("log4j.configDebug");
      if(value != null)
    LogLog.warn("[log4j.configDebug] is deprecated. Use [log4j.debug] instead.");
    }
 
    if(value != null) {
      LogLog.setInternalDebugging(OptionConverter.toBoolean(value, true));
    }

由上面代码可以看到,在加载log4j配置文件之前,先获取LogLog.DEBUG_KEY(log4j.debug)的系统属性值(再判断log4j.configDebug的值,为了向后兼容),如果该系统属性有值,则通过LogLog.setInternalDebugging(OptionConverter.toBoolean(value, true));控制LogLog的是否输出日志的开关debugEnabled。以后输出Log4j中的日志时,就可以通过该开关判断是否需要输出调试信息:

public static void debug(String msg) {
    if(debugEnabled && !quietMode) {
      System.out.println(PREFIX+msg);
    }
  }

开启了输出调试日志时,会看到log4j的调试日志如下:

-Dlog4j.debug=true
在启动时,您会看到如下记录输出:
log4j: Trying to find [log4j.xml] using context classloader 
sun.misc.Launcher$AppClassLoader@136228.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader@136228
 class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader 
sun.misc.Launcher$AppClassLoader@136228.
log4j.properties
log4j: Parsing for [root] with value=[WARN, A1].
log4j: Level token is [WARN].
log4j: Category root set to WARN
log4j: Parsing appender named "A1".
log4j: Parsing layout options for "A1".
log4j: Setting property [conversionPattern] to [%-4r [%t] %-5p %c %x - %m%n].
log4j: End of parsing for "A1".
log4j: Parsed "A1" options.
log4j: Finished configuring.

这样,我们就可以很方便的看到,log4j使用的哪个配置文件,及Appender的属性。

阅读更多

没有更多推荐了,返回首页