当前位置:   article > 正文

日志组件之debug动态开关_logback debug

logback debug

日志组件之debug动态开关

一、应用场景

二、logback简介

三、logback应用debug动态开关

 


一、应用场景

生产环境,系统日志记录级别一般高于或等于INFO,不会开启DEBUG级别的日志打印。

但如果生产环境系统出现问题,需要在一段时间内启用debug日志,以便调查分析问题,那怎么办呢?

本文将提供一种可行方案。

 

二、logback简介

Logback是由log4j创始人设计的又一个开源日志组件。

logback当前分成三个模块:logback-core,logback-classic和logback-access。logback-core是其它两个模块的基础模块。

logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14Logging。

logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

       

三、logback应用debug动态开关

       在logback中有一个过滤器TurboFilter,有以下特点:

       1.TurboFilter会试图记录上下文环境。因此他们会在每次logging请求产生的时候调用,而不是一个指定的appender使用时才出现。

       2.更重要的是,TurboFilter会在日志事件对象创建前调用。因此它具有更高性能的过滤日志事件,即使在事件被创建之前

      

       相关代码与配置:

       DebugLevelTurboFilter 基于TurboFilter。代码如下:

       

  1. import ch.qos.logback.classic.Level;
  2. import ch.qos.logback.classic.Logger;
  3. import ch.qos.logback.classic.turbo.TurboFilter;
  4. import ch.qos.logback.core.spi.FilterReply;
  5. import java.util.List;
  6. import org.slf4j.Marker;
  7. public class DebugLevelTurboFilter extends TurboFilter
  8. {
  9. protected static DebugLevelConfig debugLevelConfig = DebugLevelConfig.getInstance();
  10. public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t)
  11. {
  12. boolean acceptDebug = acceptDebug(logger, level, debugLevelConfig);
  13. if (acceptDebug) {
  14. return FilterReply.ACCEPT;
  15. }
  16. return FilterReply.NEUTRAL;
  17. }
  18. protected boolean acceptDebug(Logger logger, Level level, DebugLevelConfig logLevelDynConfig) {
  19. if ((null == logger) || (null == level) || (!level.isGreaterOrEqual(Level.DEBUG)) || (null == logLevelDynConfig) || (!logLevelDynConfig.isEnabled()))
  20. {
  21. return false;
  22. }
  23. if (logLevelDynConfig.isAcceptAll())
  24. return true;
  25. String name;
  26. if ((null != logLevelDynConfig.getMatchList()) && (!logLevelDynConfig.getMatchList().isEmpty())) {
  27. name = logger.getName();
  28. for (String className : logLevelDynConfig.getMatchList()) {
  29. if ((name.equals(className)) || (name.startsWith(className)))
  30. {
  31. return true;
  32. }
  33. }
  34. }
  35. return false;
  36. }
  37. public void start()
  38. {
  39. super.start();
  40. }
  41. }

      

       DebugLevelTurboFilter 依赖于一个动态配置组件 DebugLevelConfig(依赖于 diamond )

       

  1. import ch.qos.logback.classic.Level;
  2. import java.util.List;
  3. public class DebugLevelConfig extends AbstractDynamicConfig
  4. {
  5. private boolean enabled;
  6. private boolean acceptAll;
  7. private List
  8. matchList;
  9. private static DebugLevelConfig instance = new DebugLevelConfig();
  10. public boolean isEnabled()
  11. {
  12. return this.enabled;
  13. }
  14. public void setEnabled(boolean enabled) {
  15. this.enabled = enabled;
  16. }
  17. public Level getLevel() {
  18. return Level.DEBUG;
  19. }
  20. public List
  21. getMatchList() {
  22. return this.matchList;
  23. }
  24. public void setMatchList(List
  25. matchList) {
  26. this.matchList = matchList;
  27. }
  28. public boolean isAcceptAll() {
  29. return this.acceptAll;
  30. }
  31. public void setAcceptAll(boolean acceptAll) {
  32. this.acceptAll = acceptAll;
  33. }
  34. public static DebugLevelConfig getInstance()
  35. {
  36. return instance;
  37. }
  38. static
  39. {
  40. try
  41. {
  42. instance.init();
  43. instance.setRemoteConfigManagerListener(DiamondRemoteConfigManagerListener.getInstance());
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. }

      

       logback.xml中添加一行配置:

       <turboFilterclass="org.oschina.log.logback.filter.DebugLevelTurboFilter" />

       

  1. [%date %t %-5p]-%c [%file:%line] %m%n
  2. ${LOG_HOME}/${LOG_FIEL_NAME}-all.log
  3. ${LOG_HOME}/${LOG_FIEL_NAME}-all-%d{yyyy-MM-dd}.log
  4. [%date [%thread] %-5p]-%c [%file:%line] %m%n
  5. true
  6. false
  7. ${LOG_HOME}/${LOG_FIEL_NAME}-error.log
  8. ${LOG_HOME}/${LOG_FIEL_NAME}-error-%d{yyyy-MM-dd}.log
  9. [%date [%thread] %-5p]-%c [%file:%line] %m%n
  10. true
  11. false
  12. ERROR

       

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/163293
推荐阅读
相关标签
  

闽ICP备14008679号