本章将介绍如何将日志配置文件放入到Apollo配置中心并支持热更新
专栏目录:
欢迎关注个人公众号: Coder编程
欢迎关注个人网站:www.52melrin.com
需求
日志模块是每个项目中必须的,用来记录程序运行中的相关信息。一般在开发环境下使用DEBUG级别的日志输出,为了方便查看问题,而在线上一般都使用INFO或者ERROR级别的日志,主要记录业务操作或者错误的日志。那么问题来了,当线上环境出现问题希望输出DEBUG日志信息辅助排查的时候怎么办呢?修改配置文件,重新打包然后上传重启线上环境,之前确实是这么做的。
接下来将介绍如何通过将日志文件部署到Apollo配置中心,并支持对日志等级的修改达到热更新。这里日志等级包括对单个类日志文件等级的支持、不同环境日志等级的支持。
版本
Apollo: 0.10.2
SpringBoot: 2.0.3.RELEASE
单个类日志文件等级更改
场景:当我们发现定位到某个类中可能出现相关问题,需要进行问题排查时。可以单独指定对单独类,根据自己做的日志记录。进行日志等级的更改并支持热更新。
监听日志文件变化
@Service
public class LoggerConfiguration {
private static final Logger logger = LoggerFactory.getLogger(LoggerConfiguration.class);
private static final String LOGGER_TAG = "logging.level.";
@Autowired
private LoggingSystem loggingSystem;
@ApolloConfig
private Config config;
@ApolloConfigChangeListener
private void configChangeListter(ConfigChangeEvent changeEvent) {
refreshLoggingLevels();
}
@PostConstruct
private void refreshLoggingLevels() {
Set<String> keyNames = config.getPropertyNames();
for (String key : keyNames) {
if (containsIgnoreCase(key, LOGGER_TAG)) {
String strLevel = config.getProperty(key, "info");
LogLevel level = LogLevel.valueOf(strLevel.toUpperCase());
loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level);
logger.info("{}:{}", key, strLevel);
}
}
}
private static boolean containsIgnoreCase(String str, String searchStr) {
if (str == null || searchStr == null) {
return false;
}
int len = searchStr.length();
int max = str.length() - len;
for (int i = 0; i <= max; i++) {
if (str.regionMatches(true, i, searchStr, 0, len)) {
return true;
}
}
return false;
}
}
测试类
@RestController
public class LoggerTestController {
private static Logger logger = LoggerFactory.getLogger(LoggerTestController.class);
@RequestMapping(value = "/hello")
public String hello() {
logger.info("info--------------");
logger.error("error--------------");
logger.warn("warn--------------");
logger.debug("debug--------------");
return "Hello,World";
}
}
场景验证
当我们启动完项目,发现定位到LoggerTestController这个类中的hello方法有问题。这时候我们需要调整日志等级。
1.项目已经启动好了,发现LoggerTestController有问题
可以看到项目已经启动,部署完毕的状态。
这里,为了验证先访问:http://localhost:8099/hello 请求,控制台输出的是:
1.拷贝LoggerTestController全类路径,在签名加上logging.level.
这里我的LoggerTestController全类路径是:com.spring.boot.logger.controller.LoggerTestController
加上后的key : logging.level.com.spring.boot.logger.controller.LoggerTestController
把key部署到Apollo配置中心,value等级设置为warn
在不重启服务的情况下,再次访问http://localhost:8099/hello,控制台输出:
可以看到监听事件,以及日志等级的变成了warn等级。
继续更改等级为error,可以看到日志等级变成error等级了。这里就不再放图了。
不同环境日志等级更改
场景:从上面场景可以看出是开发人员自己定义加入的日志,下面的场景是对整个环境日志等级的更改。例如:Spring环境日志等级的更改
logging.level.org.springframework = debug
沿用上面的类文件进行验证
在不重启项目的情况下,在Apollo配置中心中加入
Key =logging.level.org.springframework
Value= debug
再次访问http://localhost:8099/hello,查看控制台输出:
这时候可以看出日志多了许多。
场景验证结束,由此已经完成了将日志配置文件放入到Apollo配置中心并支持热更新。