我已经创建了一个定制过滤器,如下所示:

@Plugin(name = "EmptyMessageFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
public class EmptyMessageFilter extends AbstractFilter {

  @PluginFactory
  public static EmptyMessageFilter createFilter() {
    return new EmptyMessageFilter();
  }
...
}

Log4j配置文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <Property name="LOG_PATTERN">
            %d{yyyy-MM-dd HH:mm:ss.SSS}
        </Property>
    </Properties>
    <!-- When filter is here it works -->
    <Filters>
        <EmptyMessageFilter/>
    </Filters>
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        <!-- When filter is here it does not work -->
        <Filters>
            <EmptyMessageFilter/>
        </Filters>  
        </Console>
  
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="ConsoleAppender"/>
        </Root>
    </Loggers>
</Configuration>

当过滤器配置在控制台附加器内时,它不工作,但当它在附加器之外时,它工作. 根据这https://logging.apache.org/log4j/2.x/manual/configuration.html#Loggers个数字,两个都应该能用.有什么不对劲的提示吗?

像RegexFilter或BurstFilter这样的预定义筛选器在附加器中也可以正常工作,但我看不出我的自定义筛选器和预定义筛选器之间有什么不同.

推荐答案

与定义单独的FilterTurboFilter接口的LogBack不同,Log4j Core只有一个Filter接口,该接口具有double purpose:

  • 当过滤器满足以下条件时,使用filter(LogEvent)方法:

    1. 连接到附加器上,
    2. 附加到附加器引用,
    3. 附加到记录器配置(与您的情况相同).
  • 其余filter种方法仅在您的筛选器是global筛选器(直接连接到配置)时使用.

你的filter(LogEvent)方法肯定不能正确工作,这就是问题所在.请注意,在本例中,您always有一条消息(通常是ObjectMessageSimpleMessageParameterizedMessage类型),尽管该消息可能是可变消息.

Java相关问答推荐

使用log 4j2格式的Hibernate 显示SQL日志(log)

我可以从Java模块中排除maven资源文件夹吗?

在Java中将Charsequence数组更改为String数组或List String<>

在AnyLogic中增加变量计数

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

如何判断一个矩阵是否为有框矩阵?

try 创建一个对象,使用它,然后使用一条语句将其存储为列表

Java中实现的归并排序算法给出ArrayIndexOutOfBound异常

这是什么Java构造`(InputStream Is)->;()->;{}`

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

Regex以查找不包含捕获组的行

错误:未找到扩展元素在JBossEAP 7.2中安装FUSE时出错

如何在SWT菜单项文本中保留@字符

为什么创建Java动态代理需要接口参数

如何制作回文程序?

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

如何设置默认序列生成器分配大小

如何使用java区分以下结果