(っ•̀ω•́)っ 如何动态修改log日志级别

一、前提:

本人使用的 log4j2 + slf4j 的日志框架,在pom.xml中添加依赖包


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- Remove Spring Boot Default Logback Dependency -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
             </exclusions>
        </dependency>

        <!-- 引入 log4j2 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
            <version>2.7.2</version>
        </dependency>        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>

二、动态修改日志级别的两种方式

方式一:调用接口


    /**
     * 动态修改业务类 Logger Level
     *
     * @param classNames 类名,需全路径, 支持设置多个
     * @param level 期望级别  DEBUG/INFO/...
     */
    @GetMapping("/loggers")
    public BaseResult getSiteScoreInfo(@RequestParam(value = "className", required = false) List<String> classNames,
                                       @RequestParam(required = false) String level) {
        if (CollectionUtils.isEmpty(classNames)) {
            return getLoggers();
        }
        return getLoggerNextLevel(classNames, level);
    }

    /**
     * 日志级别动态调整
     * 当级别为空时,INFO/DEBUG 级别间切换
     * @param classNames  指定类名
     * @param level  期望日志级别
     * @return
     */
    private BaseResult getLoggerNextLevel(List<String> classNames, String level) {
        LoggerContext logContext = LoggerContext.getContext(false);
        /** className 参数包含 “ALL” 则为所有业务类设置日志级别 **/
        boolean setAllClass = classNames.stream().anyMatch(t -> "ALL".equalsIgnoreCase(t));
        if (setAllClass) {
            classNames = logContext.getLoggers().stream().filter(logger -> logger.getName().startsWith("com.xxx"))
                    .map(Logger::getName).collect(Collectors.toList());
        }
        Level nextLevel;
        if (StringUtils.isEmpty(level)) {
            nextLevel = Objects.equals(Level.INFO, logContext.getLogger(classNames.get(0)).getLevel()) ? Level.DEBUG : Level.INFO;
        } else {
            level = level.toUpperCase();
            nextLevel = Level.getLevel(level);
        }
        List levelInfos = new ArrayList(classNames.size());
        classNames.forEach(c -> {
            logContext.getLogger(c).setLevel(nextLevel);
            Map info = new HashMap(16);
            info.put("className", c);
            info.put("level", nextLevel.getStandardLevel());
            levelInfos.add(info);
        });
        return BaseResult.success(ResultEnum.SUCCESS, levelInfos);
    }

    /**
     * 获取所有 Loggers
     *
     * @return
     */
    private BaseResult getLoggers() {
        LoggerContext logContext = LoggerContext.getContext(false);
        Collection<Logger> loggers = logContext.getLoggers();
        List<Map> collect = loggers.stream().filter(logger -> logger.getName().startsWith("com.xxx"))
                .map(logger -> {
                    Map loggerLevel = new HashMap(16);
                    loggerLevel.put("className", logger.getName());
                    loggerLevel.put("level", logger.getLevel().getStandardLevel().toString());
                    return loggerLevel;
                }).collect(Collectors.toList());
        return BaseResult.success(ResultEnum.SUCCESS, collect);
    }
}

调用以下接口URL:


http://192.168.1.26:8089/XM/debug/loggers?className=com.xxx.service.common.CommonService&level=info

方式二:通过Arthas动态修改

  1. 下载Arthas的工具包:arthas-packaging-3.5.0-bin.zip

  1. 工具包上传到linux服务器宿主机上,使用docker cp命令拷贝到容器内部


docker cp /root/arthas-packaging-3.5.0-bin.zip 容器名:/home
  1. 解压缩后启动Arthas服务


进入容器: docker exec -it 容器ID /bin/bash
进入压缩包所在目录:cd /home
unzip arthas-packaging-3.5.0-bin.zip
启动:java -jar arthas-boot.jar
找到需要修改日志级别的类:sc -d *TestService
确认类的日志级别:logger -c 3dddf45g
修改类的日志级别:logger -c 3dddf45g --name root --level debug

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值