目的
解决线上偶尔需要修改日志级别 定位问题的需要.
进口。com。阿里巴巴。杜博。常见。utils。收集实用程序;
导入com。携程。框架。阿波罗。配置;
导入com。携程。框架。阿波罗。模特。configchangevent
进口。com。携程。框架。阿波罗。春天。注释。阿波罗配置;
导入com。携程。框架。阿波罗。春天。注释。apolloconfigchangelistent
导入组织。阿帕奇。公地。郎3。stringutils
导入组织。slf4j。伐木工人;
导入组织。slf4j。伐木工人工厂;
导入组织。弹簧框架。靴子。日志记录。LogLevel
导入组织。弹簧框架。靴子。日志记录。测井系统;
导入组织。弹簧框架。语境。注释。配置;
导入javax。注释。后期构建;
导入javax。注释。资源;
导入Java。乌提尔。设置;
/**
* 动态修改线上日志的实现。
* p
* 在阿波罗上配置日志级别即可立即生效
*例如:日志记录。水平。com。fxy。启动器。猫。我的蜡染。plugin=DEBUG
*
* @作者凤凰神经
* @自2021-01-05 14:56
*/
@配置
公共类DebugConfig {
私有静态最终记录器=记录器工厂。getlogger(debugconfig。类);
私有静态最终字符串LOGGER _ TAG=' logging.level
@ApolloConfig
私有配置配置;
@资源
私有日志系统日志系统;
/**
* 发生变更时
*
* @param changeEvent
*/
@ApolloConfigChangeListener
私有void OnChange(configChangeEvent ChangeEvent){ 0
用于(字符串键: changevent。changedkeys()){ 0
if(键。启动开关(LOGGER _ TAG)){ 0
字符串NewLevel=ChangeEvent。GetChange(键)。get new value();
字符串LogNAmE=键。替换(LOGGER _ TAG ' ');
setLogLevel(logName,NewLevel);
}
}
}
/**
* 系统第一次启动的时候
*/
@PostConstruct
public void setLogLevel(){ 0
logger.info('正在初始化日志配置');
setString name=config。GetPropertyNames();
if(收集实用程序。不是空的(名称)){ 0
names.stream().过滤器(x - x.startsWith(LOGGER_TAG)).forEach(键-{ 0
字符串LogLevel=config。GetProperty(键' ');
字符串LogNAmE=键。替换(LOGGER _ TAG ' ');
setLogLevel(logName,LogLevel);
});
}
printapoloconfig();
}
私有void setLogLevel(字符串日志名,字符串日志级别){ 0
if(stringutils。ISblank(LogName)| | stringutils。ISblank(LogLevel)){ 0
返回;
}
日志级别级别=日志级别。(LogLevel)的值。ToupPerCase());
if(stringutils。isnotblank(日志名称)级别!=null){ 0
记录系统。setloglevel(logName,level);
logger.info('日志级别设置: logName={} logLevel={},',logName,LogLevel);
} else {
logger.warn('日志级别设置错误logName={} logLevel={} ',logName,LogLevel);
}
}
/**
* 打印一下阿波罗里的配置
*/
private void printapoloconfig(){ 0
logger.info('当前阿波罗里的配置:');
setString name=config。GetPropertyNames();
if(收集实用程序。不是空的(名称)){ 0
names.stream().forEach(键-{ 0
logger.info('{}={} ',key,config.getProperty(key,');
});
}
}
}