这似乎是一个疏忽错误,但我似乎无法找到原因。使用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">
,它不会影响这一点。
任何人都知道如何关闭它?
答案 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.groovy
:statusListener(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>