日志配置接入Nacos

前段时间对项目使用的配置中心进行改造,之前使用的是百度的disconf但该项目在2016年之后就处于停滞状态,另外其没有http接口用于获取配置无法满足公司建立统一配置中心的需求,于是计划将迁移至Nacos,这里简单记录下。

目标问题

在应用配置接入Nacos后,便考虑将日志配置也接入Nacos,可能有人会认为在application.yml中也是可以配置日志,但实际的使用中大多还是分开的,这样可以充分利用日框架的功能特性。那么如何将日志配置接入Nacos呢?

解决方案

EnvironmentPostProcessor

这里考虑使用Spring BootEnvironmentPostProcessor来进行集成,不了解的同学可以看看官网文档,这里做下简单的介绍。EnvironmentPostProcessor作为环境配置处理机制,利用此功能我们可以在容器启动前自定义环境和ApplicationContext,用来作为日志配置处理也算合适。

实现逻辑

实现逻辑上并不复杂,像大象装入冰箱一样分三步:

graph LR
A(创建本地配置) --> B(初始化Nacos)
B --> C(拉取Nacos配置)

本地配置

事实上一个简易的本地配置是无法避免的,这里仿照Spring Cloud创建并读取本地bootstrap.yml配置文件,设置一些需要用到的参数

1
2
3
4
5
6
7
logging:
config: /workspace/config/log.xml
nacos:
config:
server-addr: 192.168.7.176:8848
group: com.hst.boss
namespace: dev

参数主要设置了两项:

  • 日志配置文件
  • Nacos连接配置

在Nacos模型中,配置标识由三部分组成

  • namespace
  • group
  • dataId

这里日志配置使用文件名作为dataId

加载本地配置

在有了一个简易的本地配置之后,就需要读取处理,这里实现一个EnvironmentPostProcessor,具体的读取代码交由NacosStaticConfigFetcher类来处理,详情可见gist

1
2
3
4
5
6
7
package com.xxx.xxx.common.config;
public class NacosEnvironmentPostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
new NacosStaticConfigFetcher(environment).loadAndPull();
}
}

接着在src/main/resources/META-INF/spring.factories文件中添加org.springframework.boot.env.EnvironmentPostProcessor=com.xxx.xxx.common.config.NacosEnvironmentPostProcessor作为Spring Boot读取的引导,保证配置被加载即可。

写在最后

在经过此番改造只有,便能将所有配置均放入Nacos中,同时可以利用日志配置动态加载的特性实现日志级别的动态刷新,总的来说效果还是不错的,希望这篇文章能帮到各位。