在Log4j2中,是否可以根据密钥过滤掉记录器中的某些键值对?

时间:2017-03-07 02:54:47

标签: java logging configuration log4j log4j2

Log4j2是否可以配置为过滤器或其他组件可以过滤掉某些值以便在日志中打印? (但应允许同一行中的其他字段通过)

说明日志中出现以下行

 [operation=DONE, userName=junitUser, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca, 393ae7a0]], device=Device [id=12345, type=Pompom, info=Dot's Device]]], channel=null
 [operation=DONE, userName=junitUser224, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca,393ae7a0]], device=Device [id=123456, type=Mamamia, info=tom's Device]]], channel=null

现在我可以过滤掉“userName”字段,使日志行现在不包含它,如下所示吗?

 [operation=DONE, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca, 393ae7a0]], device=Device [id=12345, type=Pompom, info=Dot's Device]]], channel=null
 [operation=DONE, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca,393ae7a0]], device=Device [id=123456, type=Mamamia, info=tom's Device]]], channel=null

这是我的log4j2.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] %-5level %logger{36} - %msg%n"/>
    </Console>
    <RollingFile name="RollingFile" fileName="/Users/dunston/logs/app.log"
                 filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
        <RegexFilter regex=".* zinger_log .*" onMatch="ACCEPT" onMismatch="DENY"/>

      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
      <TimeBasedTriggeringPolicy />
    </RollingFile>
  </Appenders>
    <Loggers>
    <Root level="debug">
      <AppenderRef ref="Console"/>
      <AppenderRef ref="RollingFile"/>         
    </Root>
  </Loggers>
</Configuration>

1 个答案:

答案 0 :(得分:1)

这可以通过RewriteAppender来完成。

如果格式化的消息包含要过滤掉的正则表达式,则可能需要编写检查LogEvent消息的自定义RewritePolicy并将Message替换为另一个实例。

您可以在配置中配置自定义RewitePolicy,就像任何其他标准Log4j2 plugin一样。