Java 在Log4j2中,是否可以根据键从记录器中筛选出某些键-值对?

Java 在Log4j2中,是否可以根据键从记录器中筛选出某些键-值对?,java,logging,configuration,log4j,log4j2,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

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>

%d%p%c{1.}[%t]%m%n

这可以通过以下方法完成

如果格式化后的消息包含要过滤掉的正则表达式,则可能需要编写一个自定义函数来检查LogEvent的消息,并用另一个实例替换该消息


您的自定义RewitePolicy可以像任何其他标准Log4j2一样在配置中进行配置

我不确定如果不使用自己的扩展,这是否可行。但是,看起来您的日志记录是一个数据结构,是吗?如果是这样的话,为什么不编写一个你将调用的方法,在记录之前从数据结构中删除用户名呢?@Jeremy感谢你的回复。我希望实现的一件事是易于“配置”。就像我可以允许最终用户通过更改log4j2配置来允许/禁止某些字段一样,如果这样的功能已经作为包的一部分提供了的话。我还开始过滤数据结构的副本,专门用于生成这种类型的日志。可能通过log4j2中的ThreadContext获取字段名,并在将字段写入滚动文件日志之前过滤字段的键和值。不确定是否有其他优雅的方法可用?非常感谢!将签出并更新线程。它似乎正常工作。类似地,如果我有一个类似字符串csv的模式来记录而不是映射,我想我可能不得不使用PatternLayout方法使用regex replace?