logback设置开发环境日志级别

2018-11-24  本文已影响0人  多关心老人

生产环境日志级别一般都是warn和error,但在开发环境中,warn级别太高了,我们可能需要debug级别来观察日志输出。这时就会改动logback.xml,然后有的小伙伴一不小心就提交到代码库了,和其他小伙伴冲突甚至上线了。
上面说的是多环境公用同一个logback.xml的问题,当然可以用多个profile来区分开发和生产环境。如果一个模块很多人开发的话,不同的人关注不同的日志,如我关心sql日志,其他人可能关心spring日志或者业务日志、监控日志,这样还是要改本地的logback.xml。

其实还可以通过另一种方式不改变logback.xml来实现不同开发人员对应不同的日志输出,即先读取本地配置的日志级别,读取不到就用原来的级别,本地配置的级别可以在系统环境变量中设置。logback是支持这种方式的,语法${你的环境变量:-默认值},如

<logger name="jdbc.sqltiming" level="${logback.sql.level:-warn}" additivity="false">
        <appender-ref ref="stdout"/>
    </logger>

线上配置的是warn级别,如果本地配置了logback.sql.level=debug,那么日志级别就是debug,否则就是原来的值warn。注意warn前面是:-
配置参考:https://www.cloudesire.com/configure-logback-log-level-via-environment-variables/


源码解析:
在创建jdbc.sqltiming这个Logger的时候,读取level属性,在OptionHelper类中

  /**
   * See  http://logback.qos.ch/manual/configuration.html#variableSubstitution
   */
  public static String substVars(String input, PropertyContainer pc0, PropertyContainer pc1) {
    try {
      return NodeToStringTransformer.substituteVariable(input, pc0, pc1);
    } catch (ScanException e) {
      throw new IllegalArgumentException("Failed to parse input [" + input + "]", e);
    }
  }

先对input语法解析成Tokenizer,${logback.sql.level:-warn}会被解析成2部分:变量logback.sql.level和默认值warn,在NodeToStringTransformer类中:

private String lookupKey(String key) {
    String value = propertyContainer0.getProperty(key);
    if (value != null)
      return value;

    if (propertyContainer1 != null) {
      value = propertyContainer1.getProperty(key);
      if (value != null)
        return value;
    }

    value = OptionHelper.getSystemProperty(key, null);
    if (value != null)
      return value;

    value = OptionHelper.getEnv(key);
    if (value != null) {
      return value;
    }

    return null;
  }

会优先在logback.xml中进行变量查找,然后在SystemProperty中查找,最后到系统环境变量中查找。
看完代码就明白了吧,对于propertyContainer0和propertyContainer1有什么区别不太了解,Property和Env的区别见https://www.jianshu.com/p/ac99ce832d6b


logback其他知识点

  public static final int OFF_INT = Integer.MAX_VALUE;
  public static final int ERROR_INT = 40000;
  public static final int WARN_INT = 30000;
  public static final int INFO_INT = 20000;
  public static final int DEBUG_INT = 10000;
  public static final int TRACE_INT = 5000;
  public static final int ALL_INT = Integer.MIN_VALUE;
上一篇下一篇

猜你喜欢

热点阅读