场景
旧项目切换为微服务框架,其中为了兼容旧项目的日志框架,使用了log4j2框架。切换为log4j2框架之后,日志配置和原来的logback的日志配置有比较大的不同,其中没办法根据环境变量读取进而进行变量的转换。本篇文章主要是针对这种情况进行解决。
环境
软件 | 版本 |
---|---|
spring-boot | 2.1.1.RELEASE |
正文
原理解说
先给大家展示项目中使用的log4j2.xml文件内容,如下:
<Configuration status="WARN" monitorInterval="30">
<Properties>
<property name="springAppName" value="${spring:spring.application.name}" />
<property name="springAppPort" value="${spring:server.port}" />
<property name="LOG_INFO_FILE" value="${BUILD_FOLDER:-logs}/${springAppName}-${springAppPort}.log" />
<property name="CONSOLE_LOG_PATTERN" value="[%p] %d{yyyy-MM-dd HH:mm:ss S} - %m%n" />
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="${CONSOLE_LOG_PATTERN}"/>
</Console>
<RollingRandomAccessFile name="infoLog" fileName="${LOG_INFO_FILE}"
filePattern="${LOG_INFO_FILE}.%d{yyyy-MM-dd}.gz"
append="true">
<PatternLayout
pattern="${CONSOLE_LOG_PATTERN}"/>
<Filters>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
</Filters>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="30 MB"/>
</Policies>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!-- root logger -->
<Root level="info" includeLocation="true">
<AppenderRef ref="infoLog"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
这里的变量是使用property标签进行设置。log4j默认的标签前缀有以下几种:
具体的详情可以参考下文的参考链接,自行查看。log4j提供给我们的插件比较多了,也可以根据配置文件动态的读取数据。但是我们这里的项目是springcloud项目,配置信息都是存放在配置中心。我希望可以根据配置中心的配置进行动态读取。
源码展示
接下来给大家展示项目中使用的源码:
@Plugin(name = "spring", category = StrLookup.CATEGORY)
public class SpringEnvrionmentLookup extends AbstractLookup
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private static ConfigurableApplicationContext context;
@Override
public String lookup(final LogEvent event, final String key) {
if (context != null) {
return context.getEnvironment().getProperty(key);
}
return null;
}
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
context = configurableApplicationContext;
}
}
另外,要使用这个,需要在resource目录下面新建META-INF/spring.factories,里面的内容如下:
org.springframework.context.ApplicationContextInitializer=SpringEnvrionmentLookup
在配置中心对应的系统配置表配置对应的logging.config为classpath:log4j2.xml,不然可能会导致读取默认的logback.xml文件,进而发生日志创建失败的问题。
结果
项目启动之后,可以在控制台看到报错。不过是因为插件里面的spring环境变量未注入,所以获取的值为空,进而提示报错。不过,等待从配置中心获取到配置数据之后,即可正常运行。如果是直接查看生成的日志,则不会有这些报错。日志开头如下:
总结
网上查了很多文档,写的东西或多或少都有点问题,所以自己撰写了本篇博客,希望可以给大家一个行之有效的解决方案!!!
参考链接
lookups 官方文档
configuration官方文档
随缘求赞
如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注
可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!