Java中的MarkerFilter的应用场景及使用示例详解
作者:滴水可藏海
这篇文章主要介绍了Java中的MarkerFilter的应用场景及使用示例详解,使用log4j2,负责从消息队列收集日志的,现在系统收集到的日志能和这个系统本身的日志分开,需要的朋友可以参考下
背景
- 有一个系统是负责从消息队列收集日志的,现在系统收集到的日志能和这个系统本身的日志分开
- 使用log4j2
<!--log4j2依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> <version>2.0.1.RELEASE</version> </dependency> <!-- Log4j2 异步支持 --> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.3.6</version> </dependency>
解决方案
给我们需要的日志时间给一个特定的标记(Marker),然后使用MarkerFilter来区分收集的日志与系统本身的日志
代码
log4j2.xml配置示例
<?xml version="1.0" encoding="UTF-8"?> <!-- Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时, 你会看到log4j2内部各种详细输出。可以设置成OFF(关闭)或Error(只输出错误信息) --> <Configuration status="error" monitorInterval="60"> <!-- 日志文件目录和压缩文件目录配置 --> <Properties> <Property name="level">debug</Property> <Property name="fileName">./logs/test-program</Property> <Property name="fileGz">./logs/test-program</Property> <Property name="LOG_PATTERN"> %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level - %logger{36}.%M[%L] - %msg%xEx%n </Property> </Properties> <Appenders> <!-- 输出控制台日志的配置 --> <Console name="console" target="SYSTEM_OUT"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <!-- 输出日志的格式 --> <PatternLayout pattern="${LOG_PATTERN}"/> </Console> <!-- 打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 --> <RollingRandomAccessFile name="appLogAppender" fileName="${fileName}/app.log" immediateFlush="false" filePattern="${fileGz}/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.gz"> <PatternLayout pattern="${LOG_PATTERN}"/> <Policies> <TimeBasedTriggeringPolicy interval="6" modulate="true"/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> <Filters> <!--如果日志事件LogEvent中有COLLECTED标记,则直接拒绝这个日志事件--> <MarkerFilter marker="COLLECTED" onMatch="DENY" onMismatch="NEUTRAL"/> <!--如果日志事件LogEvent中的日志等级为${level}及以上,则接受这个日志事件--> <ThresholdFilter level="${level" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 --> <DefaultRolloverStrategy max="10"/> </RollingRandomAccessFile> <!-- 打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 --> <RollingRandomAccessFile name="collectedLogAppender" fileName="${fileName}/collected.log" immediateFlush="false" filePattern="${fileGz}/$${date:yyyy-MM}/collected-%d{MM-dd-yyyy}-%i.gz"> <PatternLayout pattern="%msg%xEx%n"/> <Policies> <TimeBasedTriggeringPolicy interval="6" modulate="true"/> <SizeBasedTriggeringPolicy size="500 MB"/> </Policies> <Filters> <!--如果日志事件LogEvent中有COLLECTED标记,则继续走接下来的filter,如果接下来没有其他的filter,onMatch的动作填ACCEPT就好了--> <MarkerFilter marker="COLLECTED" onMatch="NEUTRAL" onMismatch="DENY"/> <ThresholdFilter level="${level" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 --> <DefaultRolloverStrategy max="1000"/> </RollingRandomAccessFile> </Appenders> <!-- 全局配置,默认所有的Logger都继承此配置 --> <Loggers> <Root level="${level}" additivity="false" includeLocation="true"> <AppenderRef ref="collectedLogAppender"/> <AppenderRef ref="appLogAppender"/> <AppenderRef ref="console"/> </Root> </Loggers> </Configuration>
代码示例
//需要引入lombok的依赖 import lombok.extern.slf4j.Slf4j; //这里包名容易搞错,需要特别注意 import org.slf4j.Marker; import org.slf4j.MarkerFactory; import org.slf4j.Marker; @Slf4j public class LogCollector { private static final Marker COLLECTED_MARKER = MarkerFactory.getMarker("test_marker"); public static void main(String[] args) { log.info(COLLECTED_MARKER, "Test message~"); } }
结果
可以发现在./logs/test-program目录下,有两个日志文件:
- 一个只有收集到的日志:collected.log
- 一个只有系统日志: app.log
到此这篇关于Java中的MarkerFilter的应用场景及使用示例详解的文章就介绍到这了,更多相关MarkerFilter应用场景及使用示例内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!