看Filters如何玩转日志
2016-10-28 17:32
176 查看
#前言
前面一篇博客(《繁华浮尘,倾听Appenders的故事?》)讲到的各种Appender的配置以及使用,当然还有些未写全,更多的可以去查阅官网的资料。本篇博客讲介绍各种的Filter的配置以及相应使用,Filter可以配置在全局中,可以配置在Appender或者Appender Reference中,亦可配置在Logger中,达到控制过滤不同的日志模块信息;利用这些Filter可以实现控制日志的输出、动态控制日志的级别甚至使用脚本过滤器自己实现更为复杂的过滤控制。
Filter执行时会调用其中的一个方法并返回一个结果,该结果是一个枚举,包含:ACCEPT, DENY或者NEUTRAL。Filter可以配置在如下四个作用域:
全局范围,即直接配置在configuration最外层:该作用域的Filter直接过滤日志信息而不传递至Logger做进一步处理;若配置多个全局filter,则有且仅有一个起效,同时logger定义的level也将失效(若filter中配置了level);Logger 和 Appender的filter将覆盖全局的filter;
Logger范围: 配置在某个具体的Logger中,该filter不会传递至父级的Logger中,即使additivity配置为true;
Appender范围:作用于Appender是否处理日志过滤操作;
Appender Reference 范围:作用于Logger路由该过滤操作至某个appender上
#BurstFilter
BurstFilter用于控制每秒打印日志的数量以及设置每秒打印数量的上限;
####配置示例
#DynamicThresholdFilter
DynamicThresholdFilter用于动态控制日志的级别,有时在线上排查问题的时候,希望看到更多的日志信息来排查问题,这个filter就可以实现在不重启服务的情况下,动态去更改日志的输出级别。具体的实现方案是:新建zk node节点存放动态日志的信息并监听该节点,在log4j的配置文件中配置DynamicThresholdFilter,通过filter或者aspect设置MDC的key-value值(对应好DynamicThresholdFilter的KeyValuePair);
####配置示例
#CompositeFilter
若需要执行多条filter,则可以使用filters标签,配置多个filter;
####配置示例
#RegexFilter
RegexFilter可以实现对匹配相应的正则的日志信息做过滤,比如:选择符合正则的日志信息做格式化,其它的则过滤;
####配置示例
#TimeFilter
TimeFilter可以对日志打印的时间做过滤,比如:限制在早上8:00至12:00;
####配置示例
#ScriptFilter
如果需要实现自定义的动能,可以通过写脚本,然后配置Script执行过滤;
####配置示例
#后记
关于其他的配置,比如 layouts的格式配置等可以去查官网的信息,就不做介绍了,log4j2的相关配置到这里就结束了。后面有时间会去探究下log4j2相应的架构以及内部的实现机制,看看log4j2的AsynLogger为何性能这么好,有兴趣的可以持续关注,一块交流学习~
前面一篇博客(《繁华浮尘,倾听Appenders的故事?》)讲到的各种Appender的配置以及使用,当然还有些未写全,更多的可以去查阅官网的资料。本篇博客讲介绍各种的Filter的配置以及相应使用,Filter可以配置在全局中,可以配置在Appender或者Appender Reference中,亦可配置在Logger中,达到控制过滤不同的日志模块信息;利用这些Filter可以实现控制日志的输出、动态控制日志的级别甚至使用脚本过滤器自己实现更为复杂的过滤控制。
Filter执行时会调用其中的一个方法并返回一个结果,该结果是一个枚举,包含:ACCEPT, DENY或者NEUTRAL。Filter可以配置在如下四个作用域:
全局范围,即直接配置在configuration最外层:该作用域的Filter直接过滤日志信息而不传递至Logger做进一步处理;若配置多个全局filter,则有且仅有一个起效,同时logger定义的level也将失效(若filter中配置了level);Logger 和 Appender的filter将覆盖全局的filter;
Logger范围: 配置在某个具体的Logger中,该filter不会传递至父级的Logger中,即使additivity配置为true;
Appender范围:作用于Appender是否处理日志过滤操作;
Appender Reference 范围:作用于Logger路由该过滤操作至某个appender上
#BurstFilter
BurstFilter用于控制每秒打印日志的数量以及设置每秒打印数量的上限;
####配置示例
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Appenders> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"> <BurstFilter level="INFO" rate="16" maxBurst="100"/> <PatternLayout> <pattern>%d %p %c{1.} [%t] %m%n</pattern> </PatternLayout> <TimeBasedTriggeringPolicy /> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
#DynamicThresholdFilter
DynamicThresholdFilter用于动态控制日志的级别,有时在线上排查问题的时候,希望看到更多的日志信息来排查问题,这个filter就可以实现在不重启服务的情况下,动态去更改日志的输出级别。具体的实现方案是:新建zk node节点存放动态日志的信息并监听该节点,在log4j的配置文件中配置DynamicThresholdFilter,通过filter或者aspect设置MDC的key-value值(对应好DynamicThresholdFilter的KeyValuePair);
####配置示例
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <DynamicThresholdFilter key="loginId" defaultThreshold="ERROR" onMatch="ACCEPT" onMismatch="NEUTRAL"> <KeyValuePair key="User1" value="DEBUG"/> </DynamicThresholdFilter> <Appenders> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"> <BurstFilter level="INFO" rate="16" maxBurst="100"/> <PatternLayout> <pattern>%d %p %c{1.} [%t] %m%n</pattern> </PatternLayout> <TimeBasedTriggeringPolicy /> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
#CompositeFilter
若需要执行多条filter,则可以使用filters标签,配置多个filter;
####配置示例
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Filters> <Marker marker="EVENT" onMatch="ACCEPT" onMismatch="NEUTRAL"/> <DynamicThresholdFilter key="loginId" defaultThreshold="ERROR" onMatch="ACCEPT" onMismatch="NEUTRAL"> <KeyValuePair key="User1" value="DEBUG"/> </DynamicThresholdFilter> </Filters> <Appenders> <File name="Audit" fileName="logs/audit.log"> <PatternLayout> <pattern>%d %p %c{1.} [%t] %m%n</pattern> </PatternLayout> </File> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"> <BurstFilter level="INFO" rate="16" maxBurst="100"/> <PatternLayout> <pattern>%d %p %c{1.} [%t] %m%n</pattern> </PatternLayout> <TimeBasedTriggeringPolicy /> </RollingFile> </Appenders> <Loggers> <Logger name="EventLogger" level="info"> <AppenderRef ref="Audit"/> </Logger> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
#RegexFilter
RegexFilter可以实现对匹配相应的正则的日志信息做过滤,比如:选择符合正则的日志信息做格式化,其它的则过滤;
####配置示例
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Appenders> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"> <RegexFilter regex=".* test .*" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout> <pattern>%d %p %c{1.} [%t] %m%n</pattern> </PatternLayout> <TimeBasedTriggeringPolicy /> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
#TimeFilter
TimeFilter可以对日志打印的时间做过滤,比如:限制在早上8:00至12:00;
####配置示例
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Appenders> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"> <TimeFilter start="08:00:00" end="12:00:00" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout> <pattern>%d %p %c{1.} [%t] %m%n</pattern> </PatternLayout> <TimeBasedTriggeringPolicy /> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
#ScriptFilter
如果需要实现自定义的动能,可以通过写脚本,然后配置Script执行过滤;
####配置示例
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="ERROR"> <Scripts> <ScriptFile name="filter.js" language="JavaScript" path="src/test/resources/scripts/filter.js" charset="UTF-8" /> <ScriptFile name="filter.groovy" language="groovy" path="src/test/resources/scripts/filter.groovy" charset="UTF-8" /> </Scripts> <Appenders> <List name="List"> <PatternLayout pattern="[%-5level] %c{1.} %msg%n"/> </List> </Appenders> <Loggers> <Logger name="TestJavaScriptFilter" level="trace" additivity="false"> <AppenderRef ref="List"> <ScriptFilter onMatch="ACCEPT" onMisMatch="DENY"> <ScriptRef ref="filter.js" /> </ScriptFilter> </AppenderRef> </Logger> <Logger name="TestGroovyFilter" level="trace" additivity="false"> <AppenderRef ref="List"> <ScriptFilter onMatch="ACCEPT" onMisMatch="DENY"> <ScriptRef ref="filter.groovy" /> </ScriptFilter> </AppenderRef> </Logger> <Root level="trace"> <AppenderRef ref="List" /> </Root> </Loggers> </Configuration>
#后记
关于其他的配置,比如 layouts的格式配置等可以去查官网的信息,就不做介绍了,log4j2的相关配置到这里就结束了。后面有时间会去探究下log4j2相应的架构以及内部的实现机制,看看log4j2的AsynLogger为何性能这么好,有兴趣的可以持续关注,一块交流学习~
相关文章推荐
- Docker 如何支持多种日志方案?- 每天5分钟玩转 Docker 容器技术(88)
- 如何用 Graylog 管理日志?- 每天5分钟玩转 Docker 容器技术(93)
- Docker 如何支持多种日志方案?- 每天5分钟玩转 Docker 容器技术(88)
- 如何用 Graylog 管理日志?- 每天5分钟玩转 Docker 容器技术(93)
- Docker 如何支持多种日志方案?- 每天5分钟玩转 Docker 容器技术(88)
- 如何用 Graylog 管理日志?- 每天5分钟玩转 Docker 容器技术(93)
- Docker 如何支持多种日志方案?- 每天5分钟玩转 Docker 容器技术(88)
- 如何用 Graylog 管理日志?- 每天5分钟玩转 Docker 容器技术(93)
- 如何改变当前联机日志文件的大小
- SQL常见问题:如何利用日志还原SQL数据库?
- [分际]如何使用EVENTLOG类操作日志
- 数据库日志文件(x.ldf)如何打开?
- 如何看懂HijackThis扫描日志------学习帖
- 也谈如何缩小SQL SERVER日志文件
- 如何删除SQL SERVER 2000的日志文件空间?(转CSDN)
- 如何恢复没有日志文件的数据库的方法
- 如何收宿数据库的日志文件?
- 如何清除掉归档日志文件?
- OSWORKFLOW-如何设置Osworkflow的日志及将级别设为[DEBUG]
- SQL SERVER 数据库日志已满,如何收缩数据库日志