前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring动态修改日志级别

Spring动态修改日志级别

作者头像
十毛
发布2021-01-20 19:40:12
9270
发布2021-01-20 19:40:12
举报
文章被收录于专栏:用户1337634的专栏

线上系统的日志级别一般使用INFO或者WARN,但是在遇到问题的时候,希望拿到更低级别的日志,方便定位问题。所以需要一种动态调整日志级别的方法。

常用方法

  • 开启logback的自动扫描更新
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
  • 自定义api 但是这种方式只能逐台服务器来更新,比较麻烦,也因为负载均衡的原因,也不容易控制
代码语言:javascript
复制
@RequestMapping(value = "/setlevel")
public String updateLogbackLevel(@RequestParam(value = "level") String level,
                                 @RequestParam(value = "packageName", defaultValue = "-1") String packageName) throws Exception {
    ch.qos.logback.classic.LoggerContext loggerContext = (ch.qos.logback.classic.LoggerContext) LoggerFactory.getILoggerFactory();
    Logger logger = null
    if (packageName.equals("-1")) {
        // 默认值-1,更改全局日志级别;否则按传递的包名或类名修改日志级别。
        logger = loggerContext.getLogger("root")
    } else {
        logger = loggerContext.getLogger(packageName)
    }
    logger.setLevel(ch.qos.logback.classic.Level.toLevel(level));
    return logger.getLevel();
}
  • Spring Boot引入Actuator 修改日志级别 通过 http://localhost:8080/actuator/{loggers} 端点提供的 POST 请求,修改包路径com.xxx.aa的日志级别为DEBUG: 发送POST 请求到 http://localhost:8080/actuator/loggers/com.xxx.aa,其中请求 Body 的内容如下:
代码语言:javascript
复制
{
    "configuredLevel": "DEBUG"
}
  • 集成Spring Cloud Admin来动态修改配置 如果使用Spring Cloud Admin作为配置中心的话,这种方式是最推荐的,但是在实际项目中,Spring Cloud Admin用的比较少

配置中心实时下发(推荐)

很多开源的配置中心都支持@Value配置的实时更新,比如百度disconf,携程Apollo。使用配置中心可以让所有的服务器同步更新日志级别。

代码语言:javascript
复制
@Slf4j
@Configuration
public class TenmaoConfiguration {
    public static final Gson GSON = new Gson();

    private static final Type LOGGER_LEVEL_TYPE = new TypeToken<List<LoggerLevel>>() {
    }.getType();

    @Value("${logback.levels}")
    public void updateLogbackLevel(String levels) throws Exception {
        log.info("logback.levels: {}", levels);
        List<LoggerLevel> logbackLevels = GSON.fromJson(levels, LOGGER_LEVEL_TYPE);
        if (CollectionUtils.isEmpty(logbackLevels)) {
            return;
        }
        logbackLevels.forEach(LoggerLevel::checkAndConvert);
        ch.qos.logback.classic.LoggerContext loggerContext = (ch.qos.logback.classic.LoggerContext) LoggerFactory.getILoggerFactory();
        for (LoggerLevel entry : logbackLevels) {
            Logger logger = loggerContext.getLogger(entry.getLoggerName());
            logger.setLevel(entry.getLevel());
        }
    }

    @Data
    private static class LoggerLevel {
        private String loggerName;
        private String levelName;
        private Level level;

        public void checkAndConvert() {
            if (!Strings.isNullOrEmpty(levelName)) {
                level = Level.valueOf(levelName);
            } else {
                level = null;
            }
        }
    }
}
  • 配置内容示例(json格式的字符串)
代码语言:javascript
复制
[
  {
    "loggerName": "root",
    "levelName": "INFO"
  },{
      "loggerName": "com.tenmao.mvc.controller",
      "levelName": "DEBUG"
  }
]

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常用方法
  • 配置中心实时下发(推荐)
  • 参考
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档