springboot学习系列:使用log4j2日志框架,根据spring变量动态创建日志文件

场景

旧项目切换为微服务框架,其中为了兼容旧项目的日志框架,使用了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.configclasspath:log4j2.xml,不然可能会导致读取默认的logback.xml文件,进而发生日志创建失败的问题。

结果

项目启动之后,可以在控制台看到报错。不过是因为插件里面的spring环境变量未注入,所以获取的值为空,进而提示报错。不过,等待从配置中心获取到配置数据之后,即可正常运行。如果是直接查看生成的日志,则不会有这些报错。日志开头如下:
在这里插入图片描述

总结

网上查了很多文档,写的东西或多或少都有点问题,所以自己撰写了本篇博客,希望可以给大家一个行之有效的解决方案!!!

参考链接

lookups 官方文档
configuration官方文档

随缘求赞

如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注
可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!
在这里插入图片描述
拜拜

猜你喜欢

转载自blog.csdn.net/u013084266/article/details/108818441