如何防止在每个日志开始时logback输出自己的状态?


145

这似乎是一个粗心大意的错误,但我似乎找不到原因。使用logback / slf4j(最新版本slf4j-api-1.6.1,logback核心/经典0.9.24)进行记录。用于测试的最简单的日志配置是:

<configuration>
 <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  <layout class="ch.qos.logback.classic.PatternLayout">
   <!-- DONT USE THIS FORMATTER FOR LIVE LOGGING THE %L LINE NUMBER OUTPUTTER IS SLOW -->
   <pattern>%le %-1r [%c{1}:%L] %m%n</pattern>
  </layout>
 </appender>
 <root level="DEBUG">
  <appender-ref ref="stdout" />
 </root>
</configuration>

每个日志设置都以logback的内部状态行开始:

11:21:27,825 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
11:21:27,826 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:.../logback-test.xml]
11:21:28,116 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
11:21:28,124 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
11:21:28,129 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [stdout]
11:21:28,180 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Pushing component [layout] on top of the object stack.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - This appender no longer admits a layout as a sub-component, set an encoder instead.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
11:21:28,207 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
11:21:28,207 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [stdout] to Logger[ROOT]

根据文档,这是默认格式的logback。然后,它完成读取配置文件(将其设置为输出其他格式)并继续以正确的格式输出。有一个<configuration debug="false">不影响此的配置参数。

有人知道如何关闭此功能吗?


最新版本的logback在计算%L时要快得多。
托尔比约恩Ravn的安徒生

@ThorbjørnRavnAndersen的文档说:“ L / line:生成行号信息不是特别快。因此,除非执行速度不成问题,否则应避免使用它。” FWIW:logback.qos.ch/manual/layouts.html(所以也许更快,但仍然不是超级快之类的东西)
rogerdpack

@rogerdpack是的。通过分析异常的堆栈跟踪可以找到它。那变得更快了。
托尔比约恩Ravn的安徒生

Answers:


249

如果debugconfiguration元素的属性设置为true,您将获得所有状态信息到控制台。如果这是您的问题,只需将其设置为false或将其删除。

如果您有任何级别WARN或更高级别的配置问题,您还将获得所有状态信息记录到控制台(包括级别为的消息INFO)。解决此问题的最佳方法是解决此问题(在您的情况下,请<layout><encoder>元素)。

如果您由于某种原因无法解决问题,但是想从控制台中删除状态信息,则可以配置替代方法StatusListener。使用NopStatusListener来完全删除状态信息:

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  <!-- etc -->
</configuration>

9
这是正确的答案,应该更多支持,谢谢。(logback 1.0.11)
Jakub Kulhan

3
这工作了。我还不清楚INFO日志消息是否也会消失,但实际上它们确实会消失。我知道答案就是这样,但由于某种原因,我不清楚。太清楚了:修复编码器/布局问题,不仅警告消息会消失,而且信息消息也会消失,即使它们与问题无关。
杰森

3
不能与debug属性配合使用,但可以与状态侦听器完美配合。
Ameba Spugnosa

谢谢-需要状态监听器。
以西结·维克托

2
仔细使用这种方法,它似乎可以工作,但它掩盖了文件中存在配置错误的事实。真正的问题是WARN日志,这些问题应在config中解决,然后在所有日志中解决。信息消失。
teknopaul

45

docs中所述,如果在解析配置文件期间发生警告或错误,则logback将自动在控制台上打印状态数据。

遵循http://logback.qos.ch/codes.html#layoutInsteadOfEncoder,即logback在其警告消息中提及的链接。一旦遵循其中提到的步骤,即,如果将<layout>元素替换为<encoder>,则logback将停止在控制台上打印消息。


4
不错,尽管您确实指出了我正确的方向。尽管事实证明,删除logback.xml中另一行引起警告的行可以解决问题,但我已更改为该编码器语法,但没有任何效果。关于它的欺骗性在于,输出似乎是在实际解析您的logback文件之前就输出了决策((1>找不到资源[logback.groovy],2>找到的资源[logback-test.xml]))。对于logback测试中的修复程序,它隐藏状态消息以了解在解析之前发生的情况,这非常令人困惑。但是,谢谢你的指导。
史蒂夫·B。2010年

5
我认为Steve B.的意思是,Logback应该禁止所有状态消息,包括(特别是)那些在加载配置文件之前的状态消息,这是违反直觉的(或者至少是非常规的),除非它稍后在配置中遇到错误。当您不熟悉此规则并首先看到这些状态消息(这表示配置警告或错误)时,大多数用户会期望一旦错误解决,Logback将不再打印相关的错误消息,而是继续打印其他错误消息状态消息。
德里克·马哈尔

6
FWIW,我也觉得这很令人困惑。INFO级别消息的提示可以很好地完成隐藏ERROR消息的工作,这些消息告诉我我实际需要修复的内容。缺少DTD或配置文件语法的任何其他规范,即使我发现该消息也使其成为调试的非常试用。
汤姆·安德森

4
@Ceki:我终于弄清楚了:触发这些消息的第二种方法是debug="true"在的configuration元素中具有属性logback.xml。请提及这一点,以帮助其他陷入困境的人!
卡尔·斯莫特里奇

6
也许在第一个INFO语句之前应该有一个“检测到警告,输出所有过去的状态信息。要阻止此消息,解决您的警告/错误
大卫·罗素

7

切基答案是正确的:

(...)如果在配置文件解析过程中发生警告或错误,则logback将自动在控制台上打印状态数据。

一旦设置正确,日志的第一行将不再受到任何污染。

从2015年3月开始,在Logback 1.1.2中,您需要使用<encoder>子组件- <layout>现在已弃用,并且如果使用它,将会出现错误消息。您无法控制它,这是Logback的默认行为。

一些内部类也已重命名,甚至其手册页中的示例也已过时!

以下是其“ 错误代码帮助”页面中的代码片段,该页面具有配置记录器的正确方法。这完全解决了我项目中的问题。 http://logback.qos.ch/codes.html#layoutInsteadOfEncoder

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>testFile.log</file>
  ...
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%msg%n</pattern>
  </encoder>
</appender>

4

我意识到史蒂夫找到了解决方法,但他没有在线程中提及。如果其他任何人遇到相同的问题,这里就是解决方法。

“ <encoder> .. </ encoder>”替换“ <layout>”元素

罪魁祸首是: <layout class =“ ch.qos.logback.classic.PatternLayout”>


1
如果要完全删除这些消息,请按照Rasmus所述使用NopStatusListener。例如,编码器与布局方法不会抑制诸如“找不到logback.groovy”之类的消息。我使用的是经典的
Backback

3

我自己也遇到了同样的问题,即一开始就记录了很多与我的代码无关的行。这是我固定的方法。

<configuration debug="false">

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level 
        %logger{36} - %msg%n</pattern> </encoder> -->
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %-5level %logger{10} - %msg%n</pattern>
    </encoder>
</appender>

<root level="error">
    <appender-ref ref="STDOUT" />
</root>

<logger name="fun.n.games" level="DEBUG" />

这正在pom.xml中的以下条目运行

        <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

2

这似乎在0.9.29中已修复。刚刚做了几次测试。没有Joran INFO了。我猜是固定的承诺。


2

我在添加此行时遇到了同样的问题

        <!-- Stop output INFO at start -->
        <statusListener class="ch.qos.logback.core.status.NopStatusListener" />

在logback中,它成功地工作了


此方法有效,但是它也防止了ERROR消息的输出-发生严重的logback配置问题时,不会产生任何输出。
Honza

0

我已经尝试了一切,但对我没有任何帮助。我的问题是由于我的类路径中有多个logback.xml文件。这是多模块项目中的常见情况。当类路径中只有一个logback.xml文件时,就不会产生歧义,并且可以解决问题。


它给了你什么输出?
rogerdpack

0

使用logback.groovy:(statusListener(NopStatusListener)在中src/test/resources/logback.groovy)有效。

(有效的用例是,例如,如果在Eclipse中与ANT一起使用,使用回溯日志记录,常规类和单元测试,其中单元测试采用src/test/resources/logback.groovy,但也会看到src/main/resources/logback.groovy您不能排除的(或类似的)(如果说ANT的类路径被使用项目的类路径)。)


0

我更喜欢使用状态监听器来关闭自己的logback日志:

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  ...
</configuration>

但是如前所述,NopStatusListener也可以防止显示警告和错误。因此,您可以编写自定义状态侦听器并手动更改其日志级别:

package com.your.package;

import ch.qos.logback.core.status.OnConsoleStatusListener;
import ch.qos.logback.core.status.Status;

import java.util.List;

public class PrintOnlyWarningLogbackStatusListener extends OnConsoleStatusListener {

    private static final int LOG_LEVEL = Status.WARN;

    @Override
    public void addStatusEvent(Status status) {
        if (status.getLevel() == LOG_LEVEL) {
            super.addStatusEvent(status);
        }
    }

    @Override
    public void start() {
        final List<Status> statuses = context.getStatusManager().getCopyOfStatusList();
        for (Status status : statuses) {
            if (status.getLevel() == LOG_LEVEL) {
                super.start();
            }
        }
    }

}    

然后在您的logback.xml文件中使用它:

<configuration>
  <statusListener class="com.your.package.PrintOnlyWarningLogbackStatusListener" />
  ...
</configuration>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.