【问题标题】:SLF4J - Logging regardless of the log levelSLF4J - 不考虑日志级别的日志记录
【发布时间】:2014-12-18 13:31:33
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为你不能。您必须为消息指定日志级别,并且仅当日志级别设置为该级别或更高的日志级别时才会显示。在任何情况下,您都无法记录某些内容。除了,正如你所说的,最低级别,致命,但它在语义上是不正确的。
  • 我知道如果它已经存在那将是错误的,因为它可能被库等滥用,并且日志框架将毫无用处。但是我仍然需要那种功能,应该有一种“正确”的方式来做到这一点。
  • 听起来您已经回答了自己的问题。在您的 Java 代码中,您希望在 WARN 级别记录一些消息,以便将它们记录在开发中而不是在生产中。您想要一直记录的其他消息,因此如果您使用相同的记录器,那么在生产中,它们必须至少记录在 ERROR 级别。如果您想在较低级别(可能是 ALL)记录消息并且仍然让它们出现在所有环境中,您确实需要另一个记录器。

标签: java logging slf4j logback


【解决方案1】:

这就是 SLF4J/Logback 美妙的“Marker”功能派上用场的地方。假设您想将所有警告/错误以及任何特殊的“状态”消息记录到控制台。

你可以让一个类做这样的日志记录:

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");
    }
}

然后,在 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>

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

【讨论】:

  • 您的建议存在严重问题。 SLF4J 的标记性能非常糟糕 - jira.qos.ch/browse/SLF4J-240 记录了问题。在测试中,我们使用 SLF4J BasicMarker contains 方法(OnMarkerEvaluator 所做的)的代码比其他过滤器慢 100-300 倍。
  • @rgoers 我没有进行性能测试,也没有遇到我的日志记录成为性能瓶颈的情况,但最好记住,如果遇到更复杂的问题使用标记的高于平均水平的日志记录设置可能是其中之一。谢谢。
  • SLF4J-240 今天已修复,将在 1.7.24 版本中发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2018-07-28
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多