Springboot nacos实现日志级别动态调整

 

文章目录

前言

一、日志级别

1.ERROR 

2.WARN 

3.INFO 

4.DEBUG 

二、在nacos中配置日志级别控制信息

1.nacos配置中心添加日志级别控制配置信息

2.创建nacos监听,实现日志级别动态刷新

3.通过一个简单的dubbo接口,看下效果

4.Springboot启动类,通过@NacosPropertySource注解加载nacos配置。

总结


前言

通常我们经常遇到生产环境产生大量日志文件,从而导致空间被过多占用、检索关键信息浪费时间等问题。解决这类问题的方案挺多,比如日志切割策略配置、日志文件压缩,备份到NFS,服务器本地通过策略删除等。除了以上方式,我们还可以通过日志级别控制日志输出。


 

一、日志级别

Log4j日志按重要性程度由高到低分位4级:ERROR,WARN,INFO,DEBUG

日志级别越高,打印出的日志越少。

生产环境日志界别建议调高,避免打印大量日志占用服务空间。

1.ERROR 

error级别只记录系统逻辑出错、异常、或者重要的错误信息。如非必要,请不要在打出 error级别,避免频繁报警。

2.WARN 

warn级别日志属于系统警告信息。系统能继续运行, 但是必须引起关注,需要进行检查和调整。

3.INFO 

info级别日志主要记录有意义的事件信息,在理想情况下, INFO的日志信息要能让所有开发人员和系统管理员理解, 并从日志信息中能知道系统当前的运行状态。

4.DEBUG 

debug级别日志主要记录调试信息,可记录详细的业务处理到哪一步了,以及当前的变量状态。比如远程接口调用入参以及出参,响应时间等调试类信息。

二、在nacos中配置日志级别控制信息

1.nacos配置中心添加日志级别控制配置信息

设置logging.level.name和logging.level

Springboot nacos实现日志级别动态调整_第1张图片

2.创建nacos监听,实现日志级别动态刷新

代码如下(示例):

@Configuration
public class LoggingLevelRefresher{
    private final static Logger log = LoggerFactory.getLogger(LoggingLevelRefresher.class);
    private final static String DATA_ID="pre-loan-provider-nacos";
    private final static String GROUP_ID="pre-loan";
    @NacosValue(value = "${logging.level.name:cn.fl.preloan}",autoRefreshed = true)
    private String loggerName;
    @NacosValue(value = "${logging.level:info}",autoRefreshed = true)
    private String loggerLevel;
    @Resource
    private LoggingSystem loggingSystem;
    @NacosConfigListener(dataId = DATA_ID,groupId = GROUP_ID)
    public void onChangeValue(String value) throws BaseException {
        log.info("received changed value = {}",value);
        LogLevel logLevel = LogLevel.valueOf(loggerLevel.toUpperCase());
        loggingSystem.setLogLevel(loggerName,logLevel);
        log.info("changed {} log level to:{}", loggerName, loggerLevel);
    }
}

注意:

通过@NacosValue读取nacos配置项内容,记得设置默认值,autoRefreshed=true开始自动刷新内容读取。

通过@NacosConfigListener注解方式,实现nacos配置内容的变化监听。onChangeValue方法中通过Springboot提供的LogginSystem操作日志级别的变更即可。

3.通过一个简单的dubbo接口,看下效果

//dubbo api 定义
public interface SwaggerDemoService {
    List query(String usedFor);
}

//dubbo provider 实现
@Slf4j
public class SwaggerDemoServiceImpl implements SwaggerDemoService {
    @Override
    public List query(String usedFor) {
        log.info("info usedFor = {}",usedFor);
        log.debug("debug usedFor = {}",usedFor);
        log.warn("warn usedFor={}",usedFor);
        log.error("error usedFor={}",usedFor);
        return list;
    }
}

 服务启动默认日志级别为info,执行第一次query接口请求,日志打印如下:

 这时候去调整nacos日志级别为warn,预期应该只有warn和error级别的日志打印,修改nacos日志配置发布后,首先监听到配置变更,监听日志如下:

[INFO][pool-6-thread-1] - cn.fl.preloan.config.LoggingLevelRefresher.onChangeValue(LoggingLevelRefresher.java:41) - received changed value = logging.level.name=cn.fl.preloan
logging.level=warn

此时第二次执行query接口请求,日志打印如下,符合预期:

最后我们把nacos日志级别调整为debug级别,第三次请求query接口,预期会打印debug、info、warn、error级别日志,测试如下:

4.Springboot启动类,通过@NacosPropertySource注解加载nacos配置。

@NacosPropertySource(dataId = "pre-loan-provider-nacos",groupId = "pre-loan",autoRefreshed = true)

通过该注解可以同时加载多个nacos配置。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了日志级别控制的实现方式,我们平时工作中合理分配日志级别可以有效的减少日志文件的空间占用,通过动态变更日志级别也可以方便的排查线上问题。

nacos配置中心的实现原理以及LoggingSystem的实现原理这里先不做过多介绍,后面会更详细的篇章来介绍。

你可能感兴趣的:(nacos,疑难杂症,spring,java)