因为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行。
|
all123 被忽略掉了。从而达到了忽略其他线程的日志分流,只针对设置了ROUTINGKEY的线程进行日志捕捉、分类。 引用文章: Log4j2 将不同线程不同级别日志输出到不同的文件中 - 好一则博 Log4j – Log4j 2 Appenders