如何使用SLF4J和Log4j2记录FATAL(或任何自定义日志级别)

2022-09-02 21:12:47

我有这些具体要求

  • 需要能够登录致命级别
  • 需要使用 SLF4J
  • 需要使用 Log4j2

现在,这是我的实现

final Logger logger = LoggerFactory.getLogger(HelloWorld.class);
final Marker marker = MarkerFactory.getMarker("FATAL");
logger.error(marker, "!!! Fatal World !!!");

这是我的PatternLayout(在yaml中)

PatternLayout:
  Pattern: "%d{ISO8601_BASIC} %-5level %marker [%t] %logger{3.} - %msg%n"

这是我的日志输出

20150506T155705,158 ERROR FATAL [main] - !!! Fatal World !!!

您是否知道如何有效地从日志输出中删除“错误”?

谢谢


答案 1

Marker在这里并不是你真正想要的。 用于“丰富”日志消息,使其更易于搜索。您正在尝试更改日志级别/优先级,这略有不同。Marker

您正在使用哪个会将消息记录为一个级别。logger.error()ERROR

如果没有预定义的级别(通常有,例如 ),则使用允许您指定日志级别的泛型。FATALlogger.fatal()logger.log()

logger.fatal(yourMessage);

logger.log(priorityLevel, yourMessage);

更新:

来自SLF4J网站:

Marker 接口是 org.slf4j 包的一部分,它使 FATAL 级别在很大程度上是冗余的。如果给定的错误需要的注意超出了为普通错误分配的注意,只需使用专门指定的标记标记日志记录语句,该标记可以命名为“FATAL”或您喜欢的任何其他名称。

http://www.slf4j.org/faq.html#fatal

因此,使用SLF4J,不可能具有日志级别。我强烈反对这一决定背后的基本原理,但事实就是如此。FATAL


答案 2

以下是我与一些同事一起遇到的最接近的工作解决方案:

  1. 使用 SLF4J 标记创建致命标记类。
  2. 使用 RoutingAppender,使用标记作为路由模式:“$${marker:}”
  3. 配置一个特定于 Fatal 的追加器,该追加器具有自己的 PatternLayout,该模式布局不包含 LogLevel,而是硬编码的 FATAL 级别。

下面是 Java 示例:

Marker fatal = MarkerFactory.getMarker("FATAL");
// Usage example
final Logger logger = LoggerFactory.getLogger(FatalLogger.class);
logger.log(fatal, "this is a fatal message");

// Log sample : 
20150514T115144,279  FATAL [main] FatalLogger - this is a fatal message

下面是 YAML 示例:

Configuration:
  status: debug

  Appenders:
    RandomAccessFile:
      - name: APPLICATION_APPENDER
        fileName: logs/application.log
        PatternLayout:
          Pattern: "%d{ISO8601_BASIC} %-5level %msg%n"
      - name: FATAL_APPENDER
        fileName: logs/application.log
        PatternLayout:
          Pattern: "%d{ISO8601_BASIC} FATAL %msg%n"

    Routing:
      name: ROUTING_APPENDER
      Routes:
        pattern: "$${marker:}"
        Route:
        - key: FATAL
          ref: FATAL_APPENDER
        - ref: APPLICATION_APPENDER #DefaultRoute

  Loggers:
    Root:
      level: trace
      AppenderRef:
        - ref: ROUTING_APPENDER

推荐