我编写了一个小型控制台实用程序。在整个应用程序中,我在开发时使用 slf4j/log4j 将调试、跟踪、信息语句记录到控制台。现在我已经完成开发并想要发布它,我想禁用到控制台的所有输出,除了几个特定的记录器,并将所有剩余的记录器发送到一个文本文件。
从理论上讲,这应该相当容易。我创建了 2 个附加程序(一个 ConsoleAppender 和一个 FileAppender)。我已将 ConsoleAppender 与控制台上所需的特定记录器和根级别的 FileAppender 相关联。这工作正常。
我现在的问题是,如果我想完全禁用 FileAppender,我不知道该怎么做。如果我将 DenyAllFilter 添加到 FileAppender,它将阻止将任何内容写入文件,但仍会创建文件。如果我从 ROOT 记录器中删除 FileAppender,我会将 Log4J 写入 StdErr:
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
如果我将 ROOT 级别设置为 OFF,我已将自定义调试级别设置为仍输出的各个记录器。
如果我将 LoggerRepository 级别设置为 OFF,则所有记录器(我想转到 STDOUT 和文件的记录器)都将关闭。
有什么方法可以轻松做到这一点?理想情况下,我希望能够完全禁用文件附加程序,但是如果需要,可以提供一个命令行开关来启用它。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p %c{5} - %X{messageId} - %m%n" />
<!-- <param name="ConversionPattern" value="%m%n" /> -->
</layout>
</appender>
<appender name="LOGTXT" class="org.apache.log4j.FileAppender">
<param name="file" value="lss-client.log" />
<param name="append" value="false" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p %c{5} - %X{messageId} - %m%n" />
</layout>
<!-- <filter class="org.apache.log4j.varia.DenyAllFilter"/> -->
</appender>
<!-- Spring Loggers -->
<logger name="org.springframework">
<level value="INFO" />
</logger>
<logger name="org.springframework.ws.client.MessageTracing.sent">
<level value="TRACE" />
</logger>
<logger name="org.springframework.ws.client.MessageTracing.received">
<level value="TRACE" />
</logger>
<logger name="com.cws.cs.Client" >
<level value="INFO" />
<appender-ref ref="STDOUT" />
</logger>
<root>
<level value="INFO" />
<appender-ref ref="LOGTXT" />
</root>
</log4j:configuration>
谢谢!
埃里克