这似乎是一个疏忽错误,但我似乎无法找到原因.使用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>
Run Code Online (Sandbox Code Playgroud)
每个日志设置都以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]
Run Code Online (Sandbox Code Playgroud)
根据文档,这是格式logback用于默认值.然后它完成读取配置(设置为输出不同的格式)并继续正确格式化的输出.有一个配置参数<configuration debug="false">,不会影响这一点.
任何人都知道如何关闭它?
Ras*_*ber 230
如果debug将configuration元素的属性设置为true,则会将所有状态信息提供给控制台.如果这是您的问题,只需将其设置为false或将其删除即可.
如果您有任何级别WARN或更高级别的配置问题,您还将获得记录到控制台的所有状态信息(包括级别的消息INFO).解决此问题的最佳方法是解决问题(在您的情况下用<layout>元素替换<encoder>元素).
如果由于某种原因无法解决问题,但想要从控制台中删除状态信息,则可以改为配置替代方案StatusListener.使用NopStatusListener完全删除状态信息:
<configuration>
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
<!-- etc -->
</configuration>
Run Code Online (Sandbox Code Playgroud)
Cek*_*eki 45
如文档中所述,如果在解析配置文件期间发生警告或错误,则logback将自动在控制台上打印状态数据.
关注http://logback.qos.ch/codes.html#layoutInsteadOfEncoder,即logback在其警告消息中提到的链接.按照其中提到的步骤操作后,即,如果将<layout>元素替换为<encoder>,则logback将停止在控制台上打印消息.
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>
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用状态侦听器来关闭自己的 logback 日志:
<configuration>
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
...
</configuration>
Run Code Online (Sandbox Code Playgroud)
但正如前面提到的,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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 logback.xml 文件中使用它:
<configuration>
<statusListener class="com.your.package.PrintOnlyWarningLogbackStatusListener" />
...
</configuration>
Run Code Online (Sandbox Code Playgroud)
小智 5
我意识到史蒂夫找到了修复,但他没有在线程中提到它。如果任何其他人遇到同样的问题,这里是修复程序。
将“<layout>”元素替换为“<encoder>..</encoder>”
罪魁祸首是: <layout class="ch.qos.logback.classic.PatternLayout">
我有同样的问题,我添加了这一行
<!-- Stop output INFO at start -->
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
Run Code Online (Sandbox Code Playgroud)
在 logback 中,它成功地工作
| 归档时间: |
|
| 查看次数: |
51237 次 |
| 最近记录: |