在实际使用Apollo配置中心的项目中,可以通过修改日志级别让应用即时生效,免去了重启应用的昂贵操作。
package cn.com.example.commons.spring;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfig;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.logging.LoggingSystem;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Set;
/**
* 动态日志配置
*
* @author tianmingxing <mx.tian@qq.com>
* @date 2022-04-26
*/
@Component
@Slf4j
public class LoggerConfig {
private static final String LOGGER_TAG = "logging.level.";
@Autowired
private LoggingSystem loggingSystem;
@ApolloConfig
private Config config;
@ApolloConfigChangeListener
private void onChange(ConfigChangeEvent changeEvent) {
refreshLoggingLevels();
}
@PostConstruct
private void refreshLoggingLevels() {
Set<String> keyNames = config.getPropertyNames();
for (String key : keyNames) {
if (containsIgnoreCase(key)) {
String strLevel = config.getProperty(key, "info");
LogLevel level = LogLevel.valueOf(strLevel.toUpperCase());
loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level);
log.info("key: {}, level: {}", key, strLevel);
}
}
}
private static boolean containsIgnoreCase(String str) {
if (str == null) {
return false;
}
int len = LoggerConfig.LOGGER_TAG.length();
int max = str.length() - len;
for (int i = 0; i <= max; i++) {
if (str.regionMatches(true, i, LoggerConfig.LOGGER_TAG, 0, len)) {
return true;
}
}
return false;
}
}