将所有Logback输出抑制到控制台?

时间:2010-08-03 21:51:51

标签: java configuration logback

如何配置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中运行。

10 个答案:

答案 0 :(得分:39)

这些消息仅在至少满足下列条件之一时才显示:

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

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

答案 1 :(得分:16)

HolgerHoffstätte在他的diagnosis中是正确的,重复的类路径条目消息是Logback如何计算类路径条目的bug的症状。罗伯特·艾略特还characterizedthread上的user mailing list问题disussion。根据Robert和其他人在SLF4J邮件列表中的相关fix中的说法,当使用Logback的应用程序在WebLogic容器中运行时,由于WebLogic类加载器的运行方式,Logback会报告{{1}的重复类路径条目配置文件。但是,无论WebLogic类加载器是否应该仅报告唯一的类路径条目,Logback应该只计算唯一的类路径条目,以便它不会打印这种令人困惑的虚假消息。

我为LBCLASSIC-159实现了answer,它基本上执行了Robert Elliot推荐的内容,并使用集合而不是列表来保存类加载器返回的资源,从而有效地消除了任何重复的类路径资源。我已成功使用Logback 0.9.24,SLF4J 1.6.1和WebLogic 10.3.2测试了此修复程序。正如Thorbjørn在他的source code repository预测的那样,通过此修复,Logback不再向标准输出显示重复的类路径条目状态消息(或任何其他信息性消息)。

我希望维护者将我的修复程序集成到主要的Logback {{3}}中并将其包含在下一个版本中。

答案 2 :(得分:15)

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

很高兴,我在下面找到了一个解决方案(见更新)。

与其他一些答案相反,即使在配置阶段没有INFOERROR s,我也会收到LogBack配置WARN消息流。< / p>

以下是我的留言:

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-经典0.9.24.jar
  • 的logback核-0.9.24.jar
  • SLF4J-API-1.6.1.jar
  • 在Ubuntu 11.04下在Tomcat 6.0中运行的IceFaces 2.0应用程序中执行

<强>更新

最后想出了问题所在!

来自the fine manual(和Thorbjørn's answer):

  

在元素中设置调试属性将输出状态信息,假设

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

我的错误是

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

回想起来, duh!希望这些信息能够帮助他人。

答案 3 :(得分:8)

所以我遇到了同样的问题,但发现删除了错误的&lt; layout /&gt;在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>

我在博客上发表了关于我改变的更多complete描述的文章

答案 4 :(得分:3)

我不熟悉Logback。但如果它打印到System.outSystem.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
    }
}

(此代码未经测试)

答案 5 :(得分:2)

实际上,多次报告相同的logback.xml位置这一事实看起来更像是logback中的错误而不是其他任何错误。将此报告给logback JIRA(here)或首先检查相关jar是否多次出现在类路径中。

答案 6 :(得分:2)

就我而言,我在一个依赖项目中使用了“logback-test.xml”,该项目被部署为webapp jar。 “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”'属性,恢复日志完全消失。

答案 7 :(得分:1)

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

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

答案 8 :(得分: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>

答案 9 :(得分:1)

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

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