Springboot2整合logback.xml动态修改日志打印级别

妖狐艹你老母 2021-06-10 20:40 639阅读 0赞

今天找bug烦到了,生产上的日志级别不能修改,非常不利于排查问题,于是想到了动态修改日志打印级别, 因为上一周把项目升级成springboot2,并且使用logback.xml管理日志打印,所以修改也很方便。

  1. 在pom.xml引入日志依赖


    org.springframework.boot
    spring-boot-starter-logging

注意: 如果引入了starter依赖,则不用再引入以上依赖,因为starter模块中已经集成日志模块

  1. logback.xml文件配置如下

    <?xml version=”1.0” encoding=”UTF-8”?>


    logback










    ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>






    debug


    ${CONSOLE_LOG_PATTERN}

    UTF-8







    ${log.path}/debug.log


    %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
    UTF-8




    ${log.path}/debug-%d{yyyy-MM-dd}.%i.log

    100MB


    15




    debug









    ${log.path}/info.log


    %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
    UTF-8




    ${log.path}/info-%d{yyyy-MM-dd}.%i.log

    100MB


    15



    info
    ACCEPT
    DENY






    ${log.path}/warn.log


    %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
    UTF-8



    ${log.path}/warn-%d{yyyy-MM-dd}.%i.log

    100MB


    15



    warn
    ACCEPT
    DENY






    ${log.path}/error.log


    %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
    UTF-8



    ${log.path}/error-%d{yyyy-MM-dd}.%i.log

    100MB


    15



    ERROR
    ACCEPT
    DENY

























  1. 接口
  1. import ch.qos.logback.classic.LoggerContext;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. /**
  7. * 使用lombok日志管理框架
  8. */
  9. @Slf4j
  10. @RestController
  11. public class LogController {
  12. @GetMapping("update/logLevel")
  13. public String updateLogLevel() {
  14. LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
  15. // 将项目日志打印级别设置成debug级别,还可以根据包路径进行日志级别设置
  16. loggerContext.getLogger("root").setLevel(ch.qos.logback.classic.Level.toLevel("debug"));
  17. return "success";
  18. }
  19. /**
  20. * 测试代码
  21. */
  22. @GetMapping("/printLog")
  23. public void testLogPrint() {
  24. log.debug("debug");
  25. log.info("info");
  26. log.warn("warn");
  27. log.error("error");
  28. }
  29. }
  1. 启动springboot项目

33cbbd4acfd535605ca9794b17f0acd3.png

springboot默认的日志级别是INFO

  1. 测试

调用接口,将项目日志级别改成debug

de9cc72386342c4f3c49a0d3f319ecce.png

然后再调用测试接口

cd40f87ab5388c5eb3b6a8d936f63b07.png

再看一下debug日志文件

64381685e3ef02f765feed14508a3b17.png

-———————————————————————————————————————————————————————————————————————————————————————————————————————————————

example2:

  1. package com.chinasofti.cloudeasy.api.web;
  2. import org.slf4j.LoggerFactory;
  3. import org.springframework.util.StringUtils;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import ch.qos.logback.classic.Level;
  8. import ch.qos.logback.classic.LoggerContext;
  9. import io.swagger.annotations.Api;
  10. import io.swagger.annotations.ApiImplicitParam;
  11. import io.swagger.annotations.ApiImplicitParams;
  12. import io.swagger.annotations.ApiOperation;
  13. import lombok.extern.slf4j.Slf4j;
  14. @Api(tags = "动态修改日志级别")
  15. @RequestMapping("api/v1/monitor")
  16. @RestController
  17. @Slf4j
  18. public class LogController {
  19. /**
  20. * 修改项目日志输出级别
  21. *
  22. * @param allLevel 全局日志级别
  23. * @param singleLevel 某个类日志级别
  24. * @param singlePath 需要单独设置日志输出级别的类的全限定名(例:com.chinasofti.cloudeasy.api.web.LogController)
  25. * @return
  26. */
  27. @ApiOperation(value = "changeLogLevel")
  28. @GetMapping("changeLevel")
  29. @ApiImplicitParams({
  30. @ApiImplicitParam(name = "rootLevel",
  31. value = "root,全局级别:ALL,TRACE,DEBUG,INFO,WARN,ERROR,OFF", required = false),
  32. @ApiImplicitParam(name = "singleLevel",
  33. value = "单独设置类日志级别:ALL,TRACE,DEBUG,INFO,WARN,ERROR,OFF", required = false),
  34. @ApiImplicitParam(name = "singlePath",
  35. value = "单独类路径:com.chinasofti.cloudeasy.api.web.LogController",
  36. required = false)})
  37. public String changeLevel(String rootLevel, String singleLevel, String singlePath) {
  38. LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
  39. log.warn("set log rootLevel:{},singleLevel:{},singlePath:{}", rootLevel, singleLevel,
  40. singlePath);
  41. if (!StringUtils.isEmpty(rootLevel)) {
  42. // 设置全局日志级别
  43. ch.qos.logback.classic.Logger logger = loggerContext.getLogger("root");
  44. logger.setLevel(Level.toLevel(rootLevel));
  45. }
  46. if (!StringUtils.isEmpty(singleLevel)) {
  47. // 设置某个类日志级别-可以实现定向日志级别调整
  48. ch.qos.logback.classic.Logger vLogger = loggerContext.getLogger(singlePath);
  49. if (vLogger != null) {
  50. vLogger.setLevel(Level.toLevel(singleLevel));
  51. }
  52. }
  53. return "success";
  54. }
  55. }

发表评论

表情:
评论列表 (有 0 条评论,639人围观)

还没有评论,来说两句吧...

相关阅读