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

Dan*_*tte 10 java slf4j log4j2

我有这些具体要求:

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

现在,这是我的实现:

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

这是我的PatternLayout (在yaml中):

PatternLayout:
  Pattern: "%d{ISO8601_BASIC} %-5level %marker [%t] %logger{3.} - %msg%n"
Run Code Online (Sandbox Code Playgroud)

这是我的日志输出:

20150506T155705,158 ERROR FATAL [main] - !!! Fatal World !!!
Run Code Online (Sandbox Code Playgroud)

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

非常感谢你

Sna*_*Doc 8

Marker这不是你想要的.Marker用于"丰富"日志消息,使其更容易搜索.您正在尝试更改日志级别/优先级,这有点不同.

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

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

logger.fatal(yourMessage);
Run Code Online (Sandbox Code Playgroud)

要么

logger.log(priorityLevel, yourMessage);
Run Code Online (Sandbox Code Playgroud)

更新:

来自SLF4J网站:

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

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

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


Dan*_*tte 5

这是我与一些同事一起提出的最接近的解决方案:

  1. 使用SLF4J标记创建致命标记类.
  2. 使用RoutingAppender,使用Marker作为路由模式: "$$ {marker:}"
  3. 配置一个特定Fatal的 appender,它有自己的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
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)