如何配置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中运行。
答案 0 :(得分:39)
这些消息仅在至少满足下列条件之一时才显示:
纠正问题,这些消息应该消失。
答案 1 :(得分:16)
HolgerHoffstätte在他的diagnosis中是正确的,重复的类路径条目消息是Logback如何计算类路径条目的bug的症状。罗伯特·艾略特还characterized在thread上的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)
这是一个“我也是”的答案,对不起!
很高兴,我在下面找到了一个解决方案(见更新)。
与其他一些答案相反,即使在配置阶段没有INFO
或ERROR
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
变量中初始化我的记录器;文档建议使用实例变量。
版本:
<强>更新强>
最后想出了问题所在!
来自the fine manual(和Thorbjørn's answer):
在元素中设置调试属性将输出状态信息,假设
- 找到配置文件
- 配置文件是格式良好的XML。
醇>
我的错误是
<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.out
或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
}
}
(此代码未经测试)
答案 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。