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

时间:2010-07-15 15:32:58

标签: logback

这似乎是一个疏忽错误,但我似乎无法找到原因。使用logback / slf4j进行日志记录(最新版本为slf4j-api-1.6.1,logback core / classic 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">,它不会影响这一点。

任何人都知道如何关闭它?

10 个答案:

答案 0 :(得分:207)

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

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

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

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

答案 1 :(得分:45)

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

关注http://logback.qos.ch/codes.html#layoutInsteadOfEncoder即 logback在其警告消息中提到的链接。按照其中提到的步骤操作后,即替换&lt; layout&gt;如果元素与&lt; encoder&gt;,则logback将停止在控制台上打印消息。

答案 2 :(得分:7)

Ceki 回答是正确的:

  

(...)如果在解析配置文件期间发生警告或错误,则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>

答案 3 :(得分:4)

我意识到史蒂夫找到了修复,但他没有在线程上提到它。如果任何其他人遇到同样的问题,这里是修复。

替换“&lt; layout&gt;”带有“&lt; encoder&gt; ..&lt; / encoder&gt;”的元素 这是罪魁祸首.. &lt; layout class =“ch.qos.logback.classic.PatternLayout”&gt;

答案 4 :(得分:2)

这似乎在0.9.29中被修正了。刚做了几次测试。没有Joran INFO了。我猜this是修正提交。

答案 5 :(得分:2)

我自己也遇到了同样的问题,即一开始就记录了一堆与我的代码无关的行。这是我修复它的方法。

<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>

答案 6 :(得分:2)

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

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

在登录后成功完成

答案 7 :(得分:0)

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

答案 8 :(得分:0)

使用 logback.groovystatusListener(NopStatusListener) (在src/test/resources/logback.groovy中)。

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

答案 9 :(得分: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>