java-log4j2中MarkerFilter的使用
0.9.1-2024年8月21日10:22:21
使用场景
就是在写日志的时候,给这个日志打上标记。通过配置将打好标记的日志提取出来。
使用MarkerFilter的注意事项
- Marker标记必须是唯一的,要确保应用程序中这个标记是唯一的,包括依赖。
- 可以动态添加或删除父标记。建议在第一次获得标记时识别父级。因为,set方法在一次操作中替换所有标记,而添加和删除一次只对一个标记进行操作,所以,动态添加或者删除操作对计算机消耗较大。
- 评估有多个父标记比没有父标记的操作要耗费性能得多。大概评估一个标记是否与其祖父母相匹配的时间要比评估标记本身的时间长3倍,但与解析调用者类名或行号相比,评估标记的成本要低得多。
使用步骤
- 定义log4j2.xml配置文件,在Filters标签中定义MarkerFilter,这里定义了一个EXCEPTION的marker。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" strict="true" name="XMLConfigTest"
packages="org.apache.logging.log4j.test">
<Properties>
<Property name="filename">D:\CDesktop\dm\pac\mo2.txt</Property>
</Properties>
<Appenders>
<Appender type="Console" name="STDOUT">
<Layout type="PatternLayout" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Appender>
<Appender type="File" name="File" fileName="${filename}">
<Layout type="PatternLayout">
<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
</Layout>
</Appender>
<Appender type="File" name="errFile" fileName="D:\CDesktop\dm\pac\mo2-erro.txt">
<Layout type="PatternLayout">
<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
</Layout>
<Filters>
<!--这里定义MarkerFilter-->
<Filter type="MarkerFilter" marker="EXCEPTION"/>
</Filters>
</Appender>
</Appenders>
<Loggers>
<Logger name="org.apache.logging.log4j.test1" level="trace" additivity="false">
<AppenderRef ref="STDOUT"/>
</Logger>
<Logger name="org.apache.logging.log4j.test2" level="trace" additivity="false">
<AppenderRef ref="File"/>
</Logger>
<Logger name="org.apache.logging.log4j.test2" level="trace" additivity="false">
<AppenderRef ref="errFile"/>
</Logger>
<Root level="trace">
<AppenderRef ref="File"/>
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="errFile"/>
</Root>
</Loggers>
</Configuration>
- 代码中调用
package like;
import like.mike.book1;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
public class god {
private static Logger logger = LogManager.getLogger(god.class);
private static final Marker SQL_MARKER = MarkerManager.getMarker("SQL");
private static final Marker UPDATE_MARKER = MarkerManager.getMarker("EXCEPTION");
public static void main(String[] args) throws InterruptedException {
Document document= DocumentHelper.createDocument();
logger.info(document.toString());
new book().sayBook();
new book1().sethh();
for (int i=0;i<10;i++){
logger.info("mmmm22:"+i);
logger.debug("mmmm22:"+i);
logger.warn("mmmm22:"+i);
logger.error(UPDATE_MARKER,"mmmm22EXCEPTION:"+i);
logger.fatal("mmmm22:"+i);
logger.trace("mmmm22:"+i);
logger.fatal("2222222222");
Thread.sleep(1000);
}
}
}
- 查看执行结果
可以看到在mo2-erro.txt中将标记为UPDATE_MARKER的信息提取出来了。
console的部分输出,正常打印
2024-08-21 09:29:42.504 [main] INFO like.god - org.dom4j.tree.DefaultDocument@146044d7 [Document: name null]
this is class book
this is book1
2024-08-21 09:29:42.507 [main] INFO like.god - mmmm22:0
2024-08-21 09:29:42.507 [main] DEBUG like.god - mmmm22:0
2024-08-21 09:29:42.507 [main] WARN like.god - mmmm22:0
2024-08-21 09:29:42.508 [main] ERROR like.god - mmmm22EXCEPTION:0
2024-08-21 09:29:42.508 [main] FATAL like.god - mmmm22:0
2024-08-21 09:29:42.508 [main] TRACE like.god - mmmm22:0
2024-08-21 09:29:42.508 [main] FATAL like.god - 2222222222
2024-08-21 09:29:43.515 [main] INFO like.god - mmmm22:1
2024-08-21 09:29:43.515 [main] DEBUG like.god - mmmm22:1
2024-08-21 09:29:43.515 [main] WARN like.god - mmmm22:1
2024-08-21 09:29:43.515 [main] ERROR like.god - mmmm22EXCEPTION:1
D:\CDesktop\dm\pac\mo2-erro.txt文件的内容
2024-08-21 09:29:42,508 ERROR l.god [main] mmmm22EXCEPTION:0
2024-08-21 09:29:43,515 ERROR l.god [main] mmmm22EXCEPTION:1
2024-08-21 09:29:44,527 ERROR l.god [main] mmmm22EXCEPTION:2
参考
https://logging.apache.org/log4j/2.x/manual/api.html