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

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

轩辕华辉
2023-03-14

我有这些具体要求:

  • 需要能够登录致命级别

现在,我的实现如下:

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

这是我的模式布局(在yaml):

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

以下是我的日志输出:

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

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

非常感谢你

共有3个答案

汪飞捷
2023-03-14

我知道问题是针对log4j的。我发现这个页面时,寻找有关回登录。SL4J的建议是:https://www.slf4j.org/faq.html#fatal.

吴品
2023-03-14

以下是我与一些同事一起提出的最接近实际的解决方案:

  1. 使用SLF4J标记创建一个致命标记类。
  2. 使用RoutingAppender,使用标记作为路由模式:$${标记:}
  3. 配置一个特定于致命的附属物,它有自己的模式布局,不包括LogLevel,但硬编码的致命级别。

以下是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
方鸿振
2023-03-14

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

您正在使用记录器。error()将消息记录为错误级别。

如果没有预先定义的FATAL级别(通常有,如logger.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日志级别。我强烈反对这一决定背后的理由,但事实就是如此。

 类似资料:
  • 在我的Java应用程序中,我使用SLF4J+Logback进行日志记录。我在开发环境中使用调试级日志记录,在生产环境中使用错误级日志记录。但是有一些消息我无论如何都想要记录下来,无论日志级别如何(类似于,但使用的是logger)。 有什么切实可行的方法可以实现这一点吗?我可以使用error或更低的级别,但我想做的是给出一些信息,所以在语义上是错误的,它不是错误。 我可以在我的中为我的类定义另一个记

  • 我有一个Keycloak EAR模块,部署在Keycloak 11.0上。在我的EAR模块中,我希望使用带有SLF4J的log4j2日志库。我通过直接在pom中添加以下依赖项成功地完成了这一点:、&。 通过将设置为来排除Wildfly日志记录依赖项。在打包的EAR外部指定,并用系统属性引用。 现在问题来了。我还希望Keycloak使用log4j2,但我无法使其工作。Keycloak使用的是Jbos

  • 我的数据库中没有插入任何内容。所以我的第一个问题是为什么它不工作,请给我任何解决办法,如果可能的话。 另一个问题是,我将的intLevel调整为10,如下所示: 而现在它正在插入数据库,但也抛出了一些错误。 如有任何帮助,我们将不胜感激,并提前向您表示感谢。

  • 在我的项目中,我使用slf4j+log4j进行日志记录。我刚接触java,正在尝试了解日志记录是如何工作的。如果我想使用log4j以外的其他日志框架,比如java.util.logging,那么我就不需要更改任何代码,因为我使用的是SLF4J。我只需要移除log4j的jar,并添加java.util.logging的二进制。我试着了解当我们不改变任何代码时,它是如何工作的。如果问题不清楚,请让我知

  • 我试图从log4j1更改为log4j2。我所做的: 已删除旧配置文件log4j。xml 创建了新的配置文件log4j2。xml 创建了jboss部署结构。xml 编辑的pom 环境:野蝇10 1 EAR 4 WAR文件中没有使用web.xml。以前的log4j配置日志在EAR中(仅) Log4j2配置文件 Jboss部署结构 新的maven依赖关系 我之前说过我在SLF4j中使用log4j1。这些

  • 我目前正在启动一个新的Webapp(在tomcat 6上运行)。我有使用slf4j的组件和使用commons日志的组件。我计划使用log4j 2.0作为日志实现,原因有几个(主要针对Appender:SocketAppender和SyslogAppender,但也因为在不丢失日志事件的情况下升级配置重新加载) 现在我的问题是:-我应该用哪个接口来编程我的新类?loag4j还是slf4j?或者甚至是