当前位置: 首页 > 知识库问答 >
问题:

是否有一种方法可以根据Log4j2中的RoutingAppender标记路由日志

段渊
2023-03-14

可以使用标记筛选消息,例如:

      <MarkerFilter marker="FLOW" onMatch="ACCEPT" onMismatch="DENY"/>

但是,我正在尝试使用RoutingAppender根据标记路由消息。我不想在多个附加器中多次过滤相同的参数。以下是我的配置示例(yaml):

Routing:
  name: ROUTING_APPENDER
  Routes:
    pattern: "$${ctx:marker}" #<-- How to use Marker here?
    Route:
      - key: MyRoutingKey
        ref: MyCustomAppender

文件规定:

根据所有已注册的查找对模式进行评估,结果用于选择路由

然而,似乎并没有标记的查找,LogLevel也是如此。可以在ThreadContextMap中添加自定义MarkerValue或LogLevelValue,但我觉得解决方案效率不高,它复制了已知信息。

这是没有记录的还是不可能的?是否应该有一种内置的方式来访问Lookup中的这些值?

共有1个答案

林元明
2023-03-14

RoutingAppender的文档显示了ThreadContext查找,但路由也可以与其他查找一起使用。一个想法是创建自定义查找。

自定义查找作为log4j2插件实现。要帮助log4j2找到插件,可以在配置文件中启用packages=“yourCustomPackage”。您的插件类需要位于类路径上,以便log4j可以找到它。以下是自定义查找的插件代码:

import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;

@Plugin(name = "marker", category = "Lookup")
public class MarkerLookup implements StrLookup {

    public String lookup(String key) {
        return null
    }

    public String lookup(LogEvent event, String key) {
        final Marker marker = event.getMarker();
        return marker == null ? null : marker.getName();
    }
}

在配置文件中:

Routing:
  name: ROUTING_APPENDER
  Routes:
    pattern: "$${marker:}"
    Route:
    - key: PERFORMANCE
      ref: PERFORMANCE_APPENDER
    - key: PAYLOAD
      ref: PAYLOAD_APPENDER
    - key: FATAL
      ref: FATAL_APPENDER
    - ref: APPLICATION_APPENDER #Default route

Log4j2开发人员的学分(https://issues.apache.org/jira/browse/LOG4J2-1015)。

更新:根据他们的说法,它应该在下一个版本(2.4)中内置。所以在那之后就不需要编写自定义插件了。

 类似资料:
  • 当记录一个会话与wiremock独立,我得到的映射文件生成其中包括一个链接到身体与相同的鉴别器。 是否有一种方法可以控制(种子)鉴别器的命名,以便我可以让录制在每个录制会话上生成相同的存根名称? 这会让我的git历史不那么混乱!

  • 问题内容: 我已经读到,使用正则表达式解析XML / HTML是一个坏主意。另一种建议是使用XML解析器。BigQuery标准SQL库中是否存在一个? 问题答案: 如Elliot所提到的,这是有关如何在BigQuery中使用Javascript UDF的文档。 https://cloud.google.com/bigquery/docs/reference/standard-sql/user-de

  • 在Spock规范中,expect:或then:block中的任何行都被计算并断言为,除非它具有返回类型为的签名。 方法在类中定义如下: 我故意在那里断言,这样它就不会失败。即使失败并出现错误: 如何以及为什么方法调用结果被计算为?

  • 问题内容: 基本路线是这样的: 是否可以命名该路由并在任何模板中使用它,以便可以像这样使用它: 灵感来自Django :) 问题答案: 没有开箱即用的机制。但是,您可以模仿Django的样式:定义文件,该文件将包含URL数组。首先开始: myviews.js urls.js 现在在 app.js (或任何主文件)中,您需要将URL绑定到Express。例如这样: app.js 现在,您可以定义自定

  • 问题内容: 我正在使用Python的机制将输出打印到屏幕上。我可以使用print语句来做到这一点,但是我想允许用户调整更好的粒度以禁用某些类型的输出。我喜欢为错误打印的格式,但是当输出级别为“信息”时,我希望使用更简单的格式。 例如: 在此示例中,我希望以不同的方式打印错误的格式: 是否可以在没有多个日志记录对象的情况下针对不同的日志级别使用不同的格式?我宁愿在创建记录器后就不修改它,因为有大量的