赞
踩
日志组件之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。代码如下:
- import ch.qos.logback.classic.Level;
- import ch.qos.logback.classic.Logger;
- import ch.qos.logback.classic.turbo.TurboFilter;
- import ch.qos.logback.core.spi.FilterReply;
- import java.util.List;
- import org.slf4j.Marker;
-
- public class DebugLevelTurboFilter extends TurboFilter
- {
- protected static DebugLevelConfig debugLevelConfig = DebugLevelConfig.getInstance();
-
- public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t)
- {
- boolean acceptDebug = acceptDebug(logger, level, debugLevelConfig);
- if (acceptDebug) {
- return FilterReply.ACCEPT;
- }
-
- return FilterReply.NEUTRAL;
- }
-
- protected boolean acceptDebug(Logger logger, Level level, DebugLevelConfig logLevelDynConfig) {
- if ((null == logger) || (null == level) || (!level.isGreaterOrEqual(Level.DEBUG)) || (null == logLevelDynConfig) || (!logLevelDynConfig.isEnabled()))
- {
- return false;
- }
- if (logLevelDynConfig.isAcceptAll())
- return true;
- String name;
- if ((null != logLevelDynConfig.getMatchList()) && (!logLevelDynConfig.getMatchList().isEmpty())) {
- name = logger.getName();
- for (String className : logLevelDynConfig.getMatchList()) {
- if ((name.equals(className)) || (name.startsWith(className)))
- {
- return true;
- }
- }
- }
-
- return false;
- }
-
- public void start()
- {
- super.start();
- }
- }
DebugLevelTurboFilter 依赖于一个动态配置组件 DebugLevelConfig(依赖于 diamond ):
- import ch.qos.logback.classic.Level;
- import java.util.List;
-
- public class DebugLevelConfig extends AbstractDynamicConfig
- {
- private boolean enabled;
- private boolean acceptAll;
- private List
-
-
-
- matchList;
- private static DebugLevelConfig instance = new DebugLevelConfig();
-
- public boolean isEnabled()
- {
- return this.enabled;
- }
- public void setEnabled(boolean enabled) {
- this.enabled = enabled;
- }
- public Level getLevel() {
- return Level.DEBUG;
- }
- public List
-
-
-
- getMatchList() {
- return this.matchList;
- }
- public void setMatchList(List
-
-
-
- matchList) {
- this.matchList = matchList;
- }
- public boolean isAcceptAll() {
- return this.acceptAll;
- }
- public void setAcceptAll(boolean acceptAll) {
- this.acceptAll = acceptAll;
- }
-
- public static DebugLevelConfig getInstance()
- {
- return instance;
- }
-
- static
- {
- try
- {
- instance.init();
- instance.setRemoteConfigManagerListener(DiamondRemoteConfigManagerListener.getInstance());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
-
-
-
-
logback.xml中添加一行配置:
<turboFilterclass="org.oschina.log.logback.filter.DebugLevelTurboFilter" />
[%date %t %-5p]-%c [%file:%line] %m%n ${LOG_HOME}/${LOG_FIEL_NAME}-all.log ${LOG_HOME}/${LOG_FIEL_NAME}-all-%d{yyyy-MM-dd}.log [%date [%thread] %-5p]-%c [%file:%line] %m%n true false ${LOG_HOME}/${LOG_FIEL_NAME}-error.log ${LOG_HOME}/${LOG_FIEL_NAME}-error-%d{yyyy-MM-dd}.log [%date [%thread] %-5p]-%c [%file:%line] %m%n true false ERROR
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。