56

如何配置 Logback 以抑制其所有输出到控制台(标准输出)?特别是,我希望抑制(或重定向)Logback 自己的日志消息,例如:

16:50:25,814 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
16:50:25,814 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/opt/dap/domains/ap0491/uat1/domain/instance-config/logback.xml]
16:50:25,816 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs multiple times on the classpath.
16:50:25,816 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [file:/opt/dap/domains/ap0491/uat1/domain/instance-config/logback.xml]
16:50:25,816 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [file:/opt/dap/domains/ap0491/uat1/domain/instance-config/logback.xml]
16:50:25,923 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
16:50:25,924 |-INFO in ch.qos.logback.classic.turbo.ReconfigureOnChangeFilter@1a15291 - Will scan for changes in file [/opt/dap/domains/ap0491/uat1/domain/instance-config/logback.xml] every 60 seconds. 

我需要禁用所有到标准输出的日志记录,因为我们的生产环境不允许应用程序将任何消息打印到标准输出。

注意我使用的是 Logback 0.9.21、SLF4J 1.6.0,我们的应用程序在 WebLogic 10.3.2 中运行。

4

10 回答 10

43

这些消息仅显示以下至少一项是否为真:

  • 您在 logback.xml 文件中启用了调试
  • 您的配置有错误。这里就是这种情况 - logback 抱怨找到了多个配置文件。
  • 如果您的环境提供有冲突的文件,则会出现类路径问题。(这个昨天发生在我身上,是这个问题的真正原因)。
  • (logback 中有一个错误 - 已经发生)

纠正问题,这些消息应该会消失。

于 2010-08-03T22:26:20.667 回答
16

Holger Hoffstätte 在他的诊断中是正确的,即重复的类路径条目消息是Logback 如何计算类路径条目的错误的症状。Robert Elliot 还在Logback用户邮件列表的一个线程中描述了这个问题。根据 Robert 和其他人在 SLF4J 邮件列表的相关讨论中的说法,当使用Logback的应用程序在 WebLogic 容器中运行时,由于 WebLogic 类加载器的操作方式,Logback 会报告重复的类路径条目logback.xml配置文件。但是,无论 WebLogic 类加载器是否应该只报告唯一的类路径条目,Logback 都应该只计算唯一的类路径条目,这样它就不会打印出这种令人困惑的虚假消息。

我已经为LBCLASSIC-159实施了一个修复程序,它基本上按照 Robert Elliot 的建议进行了操作,并使用集合而不是列表来保存类加载器返回的资源,从而有效地消除了任何重复的类路径资源。我已经使用 Logback 0.9.24、SLF4J 1.6.1 和 WebLogic 10.3.2 成功测试了该修复程序。正如 Thorbjørn 在他的回答中预测的那样,有了这个修复,Logback 不再将重复的类路径条目状态消息(或任何其他信息性消息)显示到标准输出。

我希望维护者将我的修复集成到主要的 Logback源代码存储库中,并将其包含在下一个版本中。

于 2010-08-05T00:56:16.297 回答
15

这是一个“我也是”的答案,对不起!

令人高兴的是,我在下面找到了一个解决方案(请参阅更新)。

与其他一些答案相反,尽管在配置阶段INFO没有ERRORs 或s,但我收到了 LogBack 配置消息流。WARN

以下是我的留言:

13:39:20,457 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
13:39:20,457 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
13:39:20,457 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/home/carl/workspace-LSY/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/IceProfile/WEB-INF/classes/logback.xml]
13:39:20,496 |-INFO in ch.qos.logback.classic.turbo.ReconfigureOnChangeFilter@14e2c9c - Will scan for changes in file [/home/carl/workspace-LSY/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/IceProfile/WEB-INF/classes/logback.xml] every 60 seconds. 
13:39:20,496 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Adding ReconfigureOnChangeFilter as a turbo filter
13:39:20,497 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
13:39:20,501 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
13:39:20,510 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
13:39:20,510 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Pushing component [encoder] on top of the object stack.
13:39:20,537 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
13:39:20,537 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
13:39:20,538 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [ch.qos.logback] to OFF
13:39:20,538 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [ch.qos.logback] to false
13:39:20,538 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.

这是我的配置:

<configuration debug="true" scan="true"> 

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- encoders are  by default assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
  
  <logger name="ch.qos.logback" level="OFF" additivity="false" />
  
</configuration>

这是我不想要的垃圾邮件,我认为自己没有挑衅它,我希望能帮助我摆脱它。

我可能“有罪”的一个方面是我在一个static变量中初始化我的记录器。文档建议改用实例变量。

版本:

  • logback-classic-0.9.24.jar
  • logback-core-0.9.24.jar
  • slf4j-api-1.6.1.jar
  • 在 Ubuntu 11.04 下的 Tomcat 6.0 中运行的 IceFaces 2.0 应用程序中执行

更新

终于知道是什么问题了!

精美的手册(和Thorbjørn的回答):

在元素内设置调试属性将输出状态信息,假设如下:

  1. 找到配置文件
  2. 配置文件是格式良好的 XML。

我的错误是

<configuration debug="true" scan="true"> 

回想起来,呵呵!希望这些信息对其他人有所帮助。

于 2011-10-12T12:00:09.380 回答
8

所以我遇到了同样的问题,但发现删除了不正确的 <layout /> 条目,该条目在 0.9.4 左右被弃用并且消息消失了......

你的 appender 应该看起来像

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

 <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  <level>info</level>
 </filter>

 <encoder>
  <pattern>%d{yyyy-MM-dd} %d{HH:mm:ss} %.-1level %thread %logger{36}: %m%n</pattern>
 </encoder>

</appender>

我在博客上更完整地描述了对我有用的我所做的更改

于 2010-09-28T12:32:20.203 回答
8
<configuration>
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
</configuration>

简单地使用 NopStatusLinstener 类,这将停止 logback 的自我记录。

于 2018-04-23T07:24:26.447 回答
2

我不熟悉Logback。但如果它打印到System.outor System.err,这些只是类PrintStream中的公共静态变量System。您可以子类PrintStream化并将系统输出变量设置为您的子类,从而控制它的工作方式。

例如:

public class NOPPrintStream extends PrintStream
{
    public NOPPrintStream() { super((OutputStream)null); }

    public void println(String s) { /* Do nothing */ }
    // You may or may not have to override other methods
}

public class MyClass
{
    public static void main(String[] args)
    {
        System.out = new NOPPrintStream();
        // Start program
    }
}

(此代码未经测试)

于 2010-08-03T22:02:14.400 回答
2

实际上,多次报告相同的 logback.xml 位置这一事实似乎更像是 logback 中的错误,而不是其他任何事情。将此报告给 logback JIRA(此处)或首先检查有问题的 jar 是否在类路径中多次。

于 2010-08-04T10:34:00.637 回答
2

就我而言,我在一个被部署为 webapp jar 的依赖项目中有“logback-test.xml”。“logback-test.xml”文件以

<configuration debug="false" scan="true">

'scan="true"' 属性产生了这个错误:

ERROR in ch.qos.logback.classic.turbo.ReconfigureOnChangeFilter@716de067 - URL [jar:file:/C:/Local...cut.../WEB-INF/lib/My.Dev.jar!/logback-test.xml] is not of type file

这导致了 67 (!) 更多的 INFO 行。

通过删除 'scan="true"' 属性,logback 日志完全消失了。

于 2012-05-08T09:21:47.727 回答
1

您很可能在 logback.xml 中配置了一个元素。如果您不希望任何有关日志框架本身状态的控制台更新,您可以将其删除。不过,logback 框架建议不要禁用它以进行故障排除。

控制台侦听器有一个替代方法,称为 StatusListenerAsList,它将状态消息保存为私有列表。如果需要,您可以使用一点代码通过 JMX 公开它。

于 2011-12-06T02:15:06.417 回答
1

我只想添加有关在 logback 1.0.2 中添加的默认标头消息的信息:

#logback.classic pattern: %d [%thread] %-5level %logger{36} - %msg%n

我在logback news中找到了,但是真的很难找到。

如果您希望删除此消息,则必须设置outputPatternAsPresentationHeader为 false:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
        <!-- do not print pattern as a header -->
        <outputPatternAsPresentationHeader>false</outputPatternAsPresentationHeader>
    </encoder>
</appender>
于 2012-05-02T12:21:46.403 回答