springboot动态调整日志级别-LoggingSystem

    在日常项目开发中,排查问题,通常第一步是根据日志定位问题,故而,我们总是会在关键节点,尽可能多的输出日志,但是一旦系统上线,大量的日志输出,明显会影响系统的性能。

    通常,我们知道可以调整日志级别,在线上用更高的日志级别(info warn error),但是变更日志级别,总是需要重新发版,如果能动态调整日志级别,并实时生效,这不失为一个不错的办法。

由此,springboot的 LoggingSystem 可以解决这个问题。具体用法如下:

    @Autowired
    private LoggingSystem loggingSystem;

    @GetMapping("test1")
    public String test(String logLevel){
        LogLevel lv = LogLevel.DEBUG;
        if (logLevel.equalsIgnoreCase("debug")){
            lv = LogLevel.DEBUG;
        }else if (logLevel.equalsIgnoreCase("info")){
            lv = LogLevel.INFO;
        }
        loggingSystem.setLogLevel("ROOT", lv);
        log.debug("test=====");
    }

注入LoggingSystem,  并根据动态参数设置日志级别即可

loggingSystem.setLogLevel("ROOT", lv);

其中,logName默认为ROOT, 表示所有的log 通用这一规则,当然,如果在你的项目中,对log实例有定义,也可以传入自己定义的logName。

如果结合apollo ,动态配置日志级别的话,可以如下设置

@Component
@Slf4j
public class ApolloConfigListener {
    @Resource
    private RefreshScope refreshScope;

    @Autowired
    private LoggingSystem loggingSystem;

    /**
     * 监听apollo配置变化
     *
     * @param changeEvent 变化事件
     */
    @ApolloConfigChangeListener(value = {ConfigConsts.NAMESPACE_APPLICATION})
    public void onChange(ConfigChangeEvent changeEvent) {
        for (String changedKey : changeEvent.changedKeys()) {
            log.info("apollo changed namespace:{} Key:{} value:{}", changeEvent.getNamespace(), changedKey, changeEvent.getChange(changedKey));
            if (changedKey.equalsIgnoreCase("log.level")){
                setLogLevel(null,changeEvent.getChange(changedKey).toString());
            }
        }
        refreshScope.refreshAll();
    }

    private void setLogLevel(String logName,String logLevel){
        logLevel = StringUtils.isEmpty(logLevel) ? "info":logLevel;
        LogLevel lv = LogLevel.INFO;
        if (logLevel.equalsIgnoreCase("debug")){
            lv = LogLevel.DEBUG;
        }else if (logLevel.equalsIgnoreCase("info")){
            lv = LogLevel.INFO;
        }else if (logName.equalsIgnoreCase("warn")) {
            lv = LogLevel.WARN;
        }else if (logName.equalsIgnoreCase("error")){
            lv = LogLevel.ERROR;
        }
        
        logName = StringUtils.isEmpty(logName) ? "ROOT":logName;
        loggingSystem.setLogLevel(logName, lv);
    }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值