在使用布局时,如何防止日志回退在每个日志开始时输出自己的状态

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

有人知道怎么关掉吗?

67830 次浏览

作为 文件中的描述,如果在解析配置文件期间发生警告或错误,日志回退将自动在控制台上打印状态数据。

跟随 http://logback.qos.ch/codes.html#layoutInsteadOfEncoder即。 Logback 在其警告消息中提到的链接。一旦按照其中提到的步骤进行操作,也就是说,如果用 < encoder > 替换 < lay> element,logback 将停止在控制台上打印消息。

这似乎是固定在0.9.29。刚做了几个测试。没有乔兰的信息了。我想 这个是修复提交。

我意识到史蒂夫找到了解决方法,但他没有在帖子里提到。如果其他人在这里遇到同样的问题,那么修复程序就是。

“ < 编码器 > . . 替换 ”< 布局 >元素

罪魁祸首是: 布局类 = “ ch.qos.logback.Classic. PatternLayout”>

如果将 configuration元素的 debug属性设置为 true,就可以将所有状态信息传递到控制台。如果这是你的问题,只要设置为假或删除它。

如果您有任何级别 WARN或更高的配置问题,您还将获得记录到控制台的所有状态信息(包括级别 INFO的消息)。这个问题的最佳解决方案是修复这个问题(在您的例子中,用一个 <encoder>元素替换 <layout>元素)。

如果由于某种原因无法修复该问题,但希望从控制台删除状态信息,则可以配置一个替代 StatusListener。使用 NopStatusListener完全删除状态信息:

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

我什么方法都试过了,都没用。我的问题是由于类路径中的多个 logback.xml 文件造成的。这是多模块化项目中的常见情况。 当类路径中只有一个 logback.xml 文件时,就不存在歧义,问题就解决了。

Ceki 的回答是正确的:

(...)如果在解析配置文件期间出现警告或错误,日志回退将自动在控制台上打印状态数据。

一旦你做对了,你的日志的第一行就不会再有任何污染了。

从2015年3月开始,在 回溯1.1.2中,您需要使用 <encoder>子组件-<layout>现在已不推荐使用,如果使用它,将出现错误消息。您无法控制它,它是 后退默认行为。

一些内部类也被重命名了,甚至它们的手册页中的示例都已经过时了!

下面是来自它们的 错误代码帮助页的代码片段,它有配置日志记录器的正确方法。这完全解决了我的项目中的问题。 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>

我自己也在为同样的问题苦苦挣扎,也就是说,在开始的时候有一大堆与我的代码无关的行被记录下来。我是这么修的。

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

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

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

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

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

成功了

我更喜欢使用状态侦听器来关闭自己的日志记录:

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