167

这似乎是一个粗心的错误,但我似乎无法找到原因。使用 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">不会影响这一点。

有谁知道如何关闭这个?

4

10 回答 10

271

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

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

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

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  <!-- etc -->
</configuration>
于 2013-10-09T10:43:22.757 回答
47

As described in the docs, if warnings or errors occur during the parsing of the configuration file, logback will automatically print status data on the console.

Follow http://logback.qos.ch/codes.html#layoutInsteadOfEncoder i.e. the link mentioned by logback in its warning message. Once you follow the steps mentioned therein, that is, if you replace <layout> element with <encoder>, logback will stop printing messages on the console.

于 2010-07-15T21:55:37.200 回答
8

Ceki answer is correct:

(...)if warnings or errors occur during the parsing of the configuration file, logback will automatically print status data on the console.

Once you get it right, there won't be any pollution in the first lines of your log anymore.

As of March 2015, in Logback 1.1.2, you need to use <encoder> sub-component - <layout> is now deprecated and if use it, error messages will appear. You cannot control this, it´s Logback default behavior.

Some internal classes have been renamed too, and even the examples in their manual page are outdated!

Here is the code snippet from their Errors Code Help page, which has the correct way to config the logger. This fixed the issue completely in my project. 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>
于 2015-03-07T04:13:55.020 回答
5

我意识到史蒂夫找到了解决办法,但他没有在帖子中提到它。如果任何其他人遇到同样的问题,这里就是修复。

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

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

于 2013-01-15T01:14:13.467 回答
5

我有同样的问题,我添加了这一行

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

在 logback 中,它成功地工作了

于 2020-02-04T09:17:52.727 回答
4

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

<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>
于 2017-07-14T10:12:01.333 回答
2

这似乎在 0.9.29 中已修复。刚做了几个测试。没有 Joran INFO 了。我想是修复提交。

于 2011-11-17T15:43:02.197 回答
0

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

于 2015-01-22T11:03:25.757 回答
0

使用logback.groovy:statusListener(NopStatusListener)(在src/test/resources/logback.groovy) 作品。

(一个有效的用例是,例如,如果在 Eclipse 中使用 ANT,使用 logback 日志记录、groovy 类和单元测试,单元测试src/test/resources/logback.groovy采用src/main/resources/logback.groovy.项目类路径)。)

于 2018-04-18T10:49:04.307 回答
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>
于 2020-04-09T16:05:11.647 回答