生产环境可以通过阿波罗配置动态修改日志级别
package com.lh.demo.config;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.enums.PropertyChangeType;
import com.ctrip.framework.apollo.model.ConfigChange;
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.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.logging.LoggingSystem;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
/**
* @author: fenda
* @createDate: 2022/11/16 10:49
* @version: 1.0
* @description:
*/
@Slf4j
@Configuration
@RequiredArgsConstructor
public class LogListenerConfig {
public static final String LOGGING_LEVEL_PREFIX = "logging.level.";
private static final String DEFAULT_LEVEL = "info";
private final LoggingSystem loggingSystem;
@ApolloConfig
private Config config;
@PostConstruct
private void initLoggingLevel() {
if (config == null) {
log.warn("Apollo config NOT not enabled, ignore Apollo Logging Config");
return;
}
for (String configKey : config.getPropertyNames()) {
if (configKey.startsWith(LOGGING_LEVEL_PREFIX)) {
LogLevel logLevel = LogLevel.valueOf(config.getProperty(configKey, DEFAULT_LEVEL).toUpperCase());
loggingSystem.setLogLevel(configKey.replaceFirst(LOGGING_LEVEL_PREFIX, ""), logLevel);
log.info("Logging level of [{}] has been changed to {}", configKey, logLevel.name());
}
}
}
@ApolloConfigChangeListener
public void apolloConfigChange(ConfigChangeEvent changeEvent) {
for (String changedKey : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(changedKey);
String newLevel = change.getNewValue();
if (changedKey.startsWith(LOGGING_LEVEL_PREFIX)) {
LogLevel logLevel = LogLevel.valueOf(newLevel.toUpperCase());
loggingSystem.setLogLevel(changedKey.replace(LOGGING_LEVEL_PREFIX, ""), logLevel);
log.info("Logging level of [{}] has been changed from {} to {}", changedKey, change.getOldValue(), newLevel);
continue;
}
PropertyChangeType changeType = change.getChangeType();
switch (changeType) {
case ADDED:
log.info("Config [{}] Added: {}", changedKey, change.getNewValue());
break;
case MODIFIED:
log.info("Config [{}] Changed from {} to {}", changedKey, change.getOldValue(), newLevel);
break;
case DELETED:
log.info("Config [{}] Deleted: {}", changedKey, change.getOldValue());
break;
}
}
}
}