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

Ste*_* B. 132 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>
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

如果debugconfiguration元素的属性设置为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)

  • 这是正确的答案,应该更多投资,谢谢.(logback 1.0.11) (9认同)
  • 这完全奏效了,应该接受答案! (3认同)
  • 这很有效.我并不完全清楚"INFO"日志消息也会消失,但事实上它们确实消失了.我知道答案是这样的,但由于某种原因,我不清楚.要非常清楚:修复编码器/布局问题,不仅警告消息会消失,而且信息消息也会消失,即使它们与问题无关. (3认同)
  • 没有使用debug属性,但与状态监听器一起工作完美. (3认同)
  • 小心使用这种方法,它似乎有效,但它隐藏了文件中存在配置错误的事实。真正的问题是 WARN 日志,这些问题应该在 config 中修复,然后所有日志 inc. 信息走开。 (2认同)

Cek*_*eki 45

文档中所述,如果在解析配置文件期间发生警告或错误,则logback将自动在控制台上打印状态数据.

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

  • 我认为Steve B.的意思是,Logback应该抑制*all*状态消息,包括(特别是)在加载配置文件之前的那些消息是违反直觉的(或者至少是非常规的),除非它在以后遇到错误组态.当您不熟悉此规则并首先看到这些状态消息(这意味着配置警告或错误)时,大多数用户会希望一旦错误得到解决,Logback将不再打印相关的错误消息,而是继续打印其他状态消息. (5认同)
  • FWIW,我也发现这个令人困惑的行为.INFO级别消息的显示非常好地隐藏了ERROR消息,告诉我实际需要修复的内容.缺少DTD或配置文件语法的任何其他规范,甚至一旦我发现消息就进行了调试. (5认同)
  • 也许在第一个INFO声明之前,应该检测到"警告",输出所有过去的状态信息.要停止此消息,请修复警告/错误 (5认同)
  • 虽然你确实指出了我正确的方向,但也是正确的.虽然事实证明在logback.xml中删除了导致警告的另一行,但我已经改为使用该编码器语法.关于它的欺骗性的事情是输出似乎是在它实际解析你的logback文件之前输出决策,(1>找不到资源[logback.groovy],2>找到资源[logback-test.xml]).对于logback-test中的修复来说,隐藏状态消息以解决在解析之前发生的事情是非常令人困惑的.但是感谢指针. (4认同)
  • @Ceki:我终于明白了:触发这些消息的第二种方法是在`logback.xml`的`configuration`元素中使用`debug ="true"`属性.请提及这是为了其他陷入这个洞的人的利益! (4认同)
  • @Ceki:我在同一篇文章中与 binkley 处于相同的位置:logback 输出只是 INFO,但我无法让它消失。你能建议一个补救措施吗?我正在使用 logback-classic/core-0.9.24 和 slf4j-api-1.6.1 。 (2认同)

cba*_*dan 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>
Run Code Online (Sandbox Code Playgroud)


Mak*_*iuk 7

我更喜欢使用状态侦听器来关闭自己的 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">


Zin*_*oui 5

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

        <!-- Stop output INFO at start -->
        <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
Run Code Online (Sandbox Code Playgroud)

在 logback 中,它成功地工作

  • 这是可行的,但是它也可以防止错误消息输出 - 当发生严重的 logback 配置问题时不会产生任何输出。 (2认同)