SLF4J - 记录日志,无论日志级别如何

Utk*_*mir 5 java logging logback slf4j

在我的 Java 应用程序中,我使用 SLF4J + Logback 进行日志记录。我在开发环境中使用调试级别日志记录,在生产环境中使用错误级别日志记录。但有一些消息我想在任何情况下记录,无论日志级别如何(类似于System.out.println("Some Message")但使用记录器)。

有什么实际的方法可以实现这一目标吗?我可以使用错误或更低的级别,但我想做的是提供一些信息,所以logger.error("Some message");在语义上是错误的,它不是错误。

我可以在我的logback.xml类中定义另一个记录器,但这并不方便。

实现这一目标的正确方法是什么?

小智 3

这就是 SLF4J/Logback 奇妙的“标记”功能非常方便的地方。假设您想要将所有警告/错误以及任何特殊的“状态”消息记录到控制台。

你可以让一个类像这样进行日志记录:

public class MyClass {
    private static final Marker status = MarkerFactory.getMarker("STATUS");
    private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

    public void doSomething() {
        logger.info(status, "Beginning");
        logger.info("Regular info log");
        logger.warn("Warning");
        logger.info(status, "Done");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在 logback.xml 中,您进行过滤以显示标记为“STATUS”的所有警告和消息:

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
            <marker>STATUS</marker>
        </evaluator>
        <OnMatch>ACCEPT</OnMatch>
        <OnMismatch>NEUTRAL</OnMismatch>
    </filter>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>WARN</level>
    </filter>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)

基本上,您将记录器的级别设置为“调试”,以便所有内容都进入附加程序,然后在附加程序中进行进一步过滤以获得您正在寻找的确切行。如果您尝试为不同的类设置更多不同的日志记录级别,那么可能会有点棘手,但是 Logback 为过滤器提供了很大的灵活性(如果需要,您甚至可以创建自己的过滤器),这可以让您处理几乎所有需要的东西。

  • SLF4J-240 今天已修复,并将在 1.7.24 版本中发布。 (2认同)