java-动态切换日志级别的3种方案

3,567 阅读3分钟

1 通过Spring Boot Actuator 组件

1 修改yml配置文件

management:
  endpoints:
    web:
      exposure:
        include: 'loggers'

2 添加依赖

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

3 查看全局所有定义的日志级别

输入地址:http://localhost:8888/actuator/loggers

R

4 修改指定日志级别(注意参数)

5 修改前后对比(注意参数)

修改前:http://localhost:8888/actuator/loggers/ROOT

c.y.e.m.c.QueryController.getSkuInfo 测试info级别数据日志 

修改后:

[DEBUG 2019-10-10 16:45:12.726][295553873287841793][http-nio-8888-exec-8] c.y.e.m.c.QueryController.getSkuInfo 测试DEBUG级别数据日志 
[INFO  2019-10-10 16:45:12.727][295553873287841793][http-nio-8888-exec-8] c.y.e.m.c.QueryController.getSkuInfo 测试info级别数据日志 

注: 如有按照包名配置的话,URL为:http://localhost:8888/actuator/loggers/包名类名全路径 (com.xxx) 在http://localhost:8888/actuator/loggers 可查看到的可以修改。

参考: Spring Boot 2动态修改日志级别

通过springboot admin修改

1 pom设置(注意版本):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.1.6.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
 <dependency>
     <groupId>de.codecentric</groupId>
     <artifactId>spring-boot-admin-starter-server</artifactId>
     <version>2.1.1</version>
 </dependency>
 <dependency>
     <groupId>de.codecentric</groupId>
     <artifactId>spring-boot-admin-starter-client</artifactId>
     <version>2.1.1</version>
 </dependency>
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>

2 yaml配置

我这里是客户端和服务端我在一起的。

anagement:
  endpoints:
    web:
      exposure:
        include: "*"
spring:
  boot:
    admin:
      client:
        url: http://127.0.0.1:8888
        instance:
          service-base-url: http://127.0.0.1:8888/
  profiles:
    active: dev

3 启动类配置:增加@EnableAdminServer

@SpringBootApplication
@EnableAdminServer
public class EasyGoMiddlewareApplication {
    private final static Logger logger = LoggerFactory.getLogger(EasyGoMiddlewareApplication.class);
    public static void main(String[] args) {
    /**
     * org.apache.logging.slf4j.Log4jLoggerFactory
     */
        try {
            SpringApplication.run(EasyGoMiddlewareApplication.class, args);
            logger.info("数据同步应用启动成功!");
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("数据同步-启动异常,e=", e);
        }
    }
}

4 效果

地址栏输入:http://127.0.0.1:8888/

可直接点击对应的日志级别,动态修改。

[DEBUG 2019-10-11 19:44:05.787][295655724684412929][http-nio-8888-exec-10] c.y.e.m.c.QueryController.getSkuInfo 测试DEBUG级别数据日志 
[INFO  2019-10-11 19:44:05.787][295655724684412929][http-nio-8888-exec-10] c.y.e.m.c.QueryController.getSkuInfo 测试info级别数据日志 

5 与swagger2使用注意

http://localhost:8888/swagger-ui.html

按照上面配置后,swagger2就原先的地址就无法访问啦。 需处理下资源访问路径:

@Configuration
public class SpringConfig extends WebMvcConfigurerAdapter  {
    @Bean
    public TraceInterceptor traceInterceptor(){
        return new TraceInterceptor();
    }
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/templates/**.js").addResourceLocations("classpath:/templates/");
        registry.addResourceHandler("/templates/**.css").addResourceLocations("classpath:/templates/");
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(traceInterceptor()).addPathPatterns("/**");
    }

这样配置后,就可以直接访问啦。

3 通过slf4j相关扩展api修改(适用任何框架)

我们项目用的是log4j2,我只展示log4j2的demo,其他日志框架log4j、logback同理。

也可以参考美团这个,比较全面点。

日志级别动态调整——小工具解决大问题

pom引入:

  <dependency>
             <groupId>org.apache.logging.log4j</groupId>
             <artifactId>log4j-core</artifactId>
             <version>2.11.1</version>
             <scope>compile</scope>
  </dependency>
/**
     * 动态修改log4j2日志框架级别
     * @return
     */
    public String updateLog4j2Level(String motifyLevel){
        Level level = Level.toLevel(motifyLevel);
        LoggerContext context = (LoggerContext) LogManager.getContext(false);
        Configuration configuration = context.getConfiguration();
        for (Map.Entry<String, LoggerConfig> entry : configuration.getLoggers().entrySet()) {
            if (entry.getValue().getLevel().intLevel() != level.intLevel()) {
                entry.getValue().setLevel(level);
            }
        }
        configuration.getLoggerConfig("ROOT").setLevel(level);
        context.updateLoggers(configuration);
        return "sucess";
    }

这个可自行扩展,可以到logger packge级别的。而不是全局的。自行扩展。