当前位置: 首页 > 面试题库 >

Log4j2自定义过滤器

有翰海
2023-03-14
问题内容

我试图在Log4J2中实现和配置自定义过滤器-
基于ThresholdFilter,但打算做更多。我已经看到了有关自定义追加程序的主题,这些主题遵循相同的插件注释语法,但是还没有找到有关自定义拟合程序的主题。

MyCustomFilter.java (基于ThresholdFilter)

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

    private static final long serialVersionUID = 1L;

    private final Level level;

    private MyCustomFilter(final Level level, final Result onMatch, final Result onMismatch) {
        super(onMatch, onMismatch);
        this.level = level;
    }

    @Override
    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg, final Object... params) {
        return filter(level);
    }

    @Override
    public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg, final Throwable t) {
        return filter(level);
    }

    @Override
    public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg, final Throwable t) {
        return filter(level);
    }

    @Override
    public Result filter(final LogEvent event) {
        return filter(event.getLevel());
    }

    private Result filter(final Level level) {
        return level.isMoreSpecificThan(this.level) ? onMatch : onMismatch;
    }

    @Override
    public String toString() {
        return level.toString();
    }

    /**
     * Create a MyCustomFilter.
     * 
     * @param level
     *            The log Level.
     * @param match
     *            The action to take on a match.
     * @param mismatch
     *            The action to take on a mismatch.
     * @return The created MyCustomFilter.
     */
    @PluginFactory
    public static MyCustomFilter createFilter(@PluginAttribute("level") final Level level, @PluginAttribute("onMatch") final Result match,
            @PluginAttribute("onMismatch") final Result mismatch) {
        final Level actualLevel = level == null ? Level.ERROR : level;
        final Result onMatch = match == null ? Result.NEUTRAL : match;
        final Result onMismatch = mismatch == null ? Result.DENY : mismatch;
        return new MyCustomFilter(actualLevel, onMatch, onMismatch);
    }

}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

  <MyCustomFilter level="fatal" />

  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%c{5}.%M():%L] %m%n" />
    </Console>
  </Appenders>

  <Loggers>
    <Logger name="com.me.test.logger" level="info" additivity="false">
      <AppenderRef ref="STDOUT" />
    </Logger>

    <!-- Root Logger -->
    <Root level="warn">
      <AppenderRef ref="STDOUT" />
    </Root>
  </Loggers>

</Configuration>

LoggingRunner.java

public class LoggingRunner {

    public static void main(String[] args) {
        Logger logger = LogManager.getLogger("com.me.test.logger");

        logger.fatal("Fatal");
        logger.error("Error");
        logger.debug("Debug");
        logger.info("Info");

        System.out.println("end it");
    }

}

配置语法似乎与Apache文档中的语法匹配,并且模仿ThresholdFilter(有效的提供的过滤器)。如果将其放置为如图所示,作为上下文级别的筛选器,我看不到任何错误,但是没有调用或应用该筛选器。

如果我将自定义过滤器标签移动到Appender内(这对于开箱即用的过滤器是可能的,我会得到2015-03-24 16:20:11,713 ERROR AppenderRef contains an invalid element or attribute "MyCustomFilter"

基于Apache Log4J2文档和log42j核心源代码中的示例,我认为这可以工作。

我究竟做错了什么?


问题答案:

您能显示配置的第一行<Configuration>元素吗?

您可以指定<Configuration status="trace">使log4j的内部日志记录出现在控制台上,这可能有助于解决问题。

也许log4j找不到您的插件。

编译插件时,将创建序列化的插件列表文件。该文件包含您的插件的名称和二进制格式的类名。如果此文件包含在包含您的插件类的jar中,则log4j可以找到您的插件。帮助log4j查找插件的另一种方法是为packages配置文件指定属性:

<Configuration status="trace" packages="com.me.mycustomfilterpackage"> ...

有关更多详细信息,请参见本手册页,了解PluginManager如何尝试查找插件。



 类似资料:
  • 演示在网关追加一个header public class CustomFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 演示在网关追加heade

  • SOFARPC 提供了一套良好的可扩展性机制,为各个模块提供 SPI 的能力。 SOFARPC 对请求与响应的过滤链处理方式是通过多个过滤器 Filter 来进行具体的拦截处理,该部分可由用户自定义 Filter 扩展,自定义 Filter 的执行顺序在内置 Filter 之后。具体方式如下: Bolt Filter 新建自定义 Filter 。 public class CustomFilter

  • 本文向大家介绍Django 自定义过滤器,包括了Django 自定义过滤器的使用技巧和注意事项,需要的朋友参考一下 示例 过滤器允许您将函数应用于变量。此函数可以使用0或1参数。语法如下: 过滤器可以链接在一起,因此非常有效: 如果将其翻译成python,上面的代码行将给出以下内容: 在此示例中,我们将编写一个verbose_name适用于模型(实例或类)或QuerySet的自定义过滤器。它将返回

  • Dorado支持在Client或Server端创建自定义的过滤器并指定过滤器的优先级生成过滤器链路。 Dorado支持全局生效的Filter和单个配置生效的Filter,具体使用方式见下面说明。 1.过滤器接口定义 package com.meituan.dorado.rpc.handler.filter; /** * 过滤器接口, 可自行实现 * * 全局生效Filter,通过SPI配置

  • 本文向大家介绍vue自定义filters过滤器,包括了vue自定义filters过滤器的使用技巧和注意事项,需要的朋友参考一下 官方给出 详情查看 在项目中我们如果有多个filters,那么我怎么一次注册,全局可用,我们在项目里新建一个filters文件夹,如下,index.js是出口文件,readMore是一个对字符串做处理的过滤器 文件目录 下面贴上代码: 然后在main.js里面做如下处理:

  • 问题内容: 因此,我一直在尝试制作一个自定义过滤器,该过滤器搜索“ Startswith”参数而不是“ Contains”。我写的每个过滤器似乎都无法正常工作。这是我要实现的目标的一个示例—> http://jsfiddle.net/DMSChris/9ptr9/ } http://jsbin.com/OyubElO/1/edit-这是我现在所在的位置。 任何帮助将不胜感激! 问题答案: 一种简单