Log4j2给任意业务配置动态文件写出

因为echo中使用了Log4j2作为业务日志框架,现在对与基本使用和配置,不做过多描述。

需求:给每个任务打印自己的日志,并分别追加到不同的文件。例如:Kafka->MQ任务,需要根据不同的业务主题分别记录数据的提交记录,包括MQ生成的package ID,还有Kafka的分区- offset-消费时间,记录到日志文件,供业务对账数据统计使用。

一般情况下,echo的不同任务实例,还有每个实例中的不同输入/输出组件,是运行在不同线程中的,这里我们使用log4j2的routing组件,让日志组件根据不同的条件动态分流,还有使用了ThreadContext特性,在filename中使用ThreadContext定义业务key,以动态生成文件。

log4j2.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<appenders>
    <Routing name="Routing">
            <!--  预防工作流关闭,导致的空闲appender浪费资源,30分钟未打印日志则清除-->
            <IdlePurgePolicy timeToLive="30" timeUnit="minutes" />
 
            <Routes pattern="$${ctx:ROUTINGKEY}">
                <Route>
                    <RollingFile name="Rolling-default" fileName="./logs/mq-${ctx:ROUTINGKEY}.log"
                                 filePattern="./logs/${date:yyyy-MM}/mq-${ctx:ROUTINGKEY}-%d{yyyy-MM-dd}-%i.log.gz" >
 
                        <PatternLayout>
                            <pattern>%d{ISO8601} [%t] %p %c{3} - %m%n</pattern>
                        </PatternLayout>
                        <Policies>
                            <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
                            <SizeBasedTriggeringPolicy size="10 MB"/>
                        </Policies>
                    </RollingFile>
                </Route>
                <Route  key="$${ctx:ROUTINGKEY}">
                    <!-- 默认策略 -->
                    <Console name="Console" target="SYSTEM_OUT" >
                        <!-- 这个是关闭其他的配置 不追加日志 -->
                        <LevelRangeFilter maxLevel="OFF" />
                    </RollingFile>
                </Route>
            </Routes>
 
        </Routing>
 
 
    </appenders>
 
    <root level="debug">
            <AppenderRef ref="Routing"/>
        </root>
    </loggers>
</configuration>

测试类如下:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
 
public class TestLog {
    private static final Logger logger = LogManager.getLogger(TestLog.class);
    public static void main(String[] args) {
        logger.info("all123");
        new Thread(() -> {
            ThreadContext.put("ROUTINGKEY", "主题1");
            logger.info("info");
            logger.debug("debug");
            logger.error("error");
            ThreadContext.remove("ROUTINGKEY");
        }).start();
        new Thread(() -> {
            ThreadContext.put("ROUTINGKEY",  "主题2");
            logger.info("info");
            logger.debug("debug");
            logger.error("error");
            ThreadContext.remove("ROUTINGKEY");
        }).start();
    }
}

运行查看,生成文件如下:

查看文件内容,两个文件中都只有如下3行。

2024-04-11T17:37:54,924 [Thread-2] INFO client.test.TestLog - info

2024-04-11T17:37:54,944 [Thread-2] DEBUG client.test.TestLog - debug

2024-04-11T17:37:54,944 [Thread-2] ERROR client.test.TestLog - error

all123 被忽略掉了。从而达到了忽略其他线程的日志分流,只针对设置了ROUTINGKEY的线程进行日志捕捉、分类。


引用文章:
Log4j2 将不同线程不同级别日志输出到不同的文件中 - 好一则博
Log4j – Log4j 2 Appenders
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot是一款非常优秀的Java web开发框架,其内置了很多强大的特性,比如自动配置、快速开发等。在开发过程中,我们经常需要使用日志框架来记录系统运行过程中的信息、警告和错误等。而Log4j2是Apache的一个开源项目,是Log4j的升级版,具有更好的性能和更丰富的功能。 下面是使用Log4j2作为Spring Boot项目的日志框架的详细配置文件: 1. 首先,需要在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> ``` 2. 在src/main/resources目录下新建log4j2.xml文件,内容如下: ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%-5level} %logger{36} - %msg%n"/> </Console> <RollingFile name="file" fileName="logs/myapp.log" filePattern="logs/myapp-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern> </PatternLayout> <Policies> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="console"/> <AppenderRef ref="file"/> </Root> </Loggers> </Configuration> ``` 以上配置文件中,定义了两个Appender,一个是Console Appender,用于将日志输到控制台;另一个是RollingFile Appender,用于将日志输文件中,并支持文件滚动。其中,RollingFile Appender使用了SizeBasedTriggeringPolicy来控制文件大小,以及DefaultRolloverStrategy来控制文件滚动。最后,在Loggers中配置了Root Logger,将日志输到Console和RollingFile Appender中。 3. 在Spring Boot的application.properties文件中,配置日志级别: ```properties logging.level.root=info ``` 以上配置将Root Logger的日志级别设置为info,也可以根据需要设置其他Logger的日志级别。 4. 在代码中使用Log4j2输日志: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyApp { private static final Logger logger = LoggerFactory.getLogger(MyApp.class); public static void main(String[] args) { logger.debug("Debug message"); logger.info("Info message"); logger.warn("Warn message"); logger.error("Error message"); } } ``` 使用上述配置后,日志将会按照配置到控制台和文件中。如果需要更改日志输的路径,可以在log4j2.xml文件中修改RollingFile Appender中的fileName属性。如果需要更改日志文件的格式,可以修改PatternLayout中的pattern属性。如果需要设置其他的Appender和Logger,可以在log4j2.xml文件中进行配置

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值