我写了一个小型控制台实用程序。在整个应用程序中,我使用slf4j / log4j将调试,跟踪,信息语句记录到控制台,因为我正在开发它。既然我已完成开发并想要发布它,我想禁用除了几个特定记录器之外的所有输出到控制台,并将所有剩余的记录器发送到文本文件。
从理论上讲,这应该相当容易。我创建了2个appender(一个ConsoleAppender和一个FileAppender)。我已将ConsoleAppender与控制台上的特定记录器和Root级别的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 Level设置为OFF,那么所有记录器(我想要转到STDOUT和File的记录器)都将被关闭。
有没有办法轻松做到这一点?理想情况下,我希望能够完全禁用文件appender,但是如果需要,可以提供命令行开关来启用它。
<?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>
谢谢!
埃里克
答案 0 :(得分:2)
当您配置FileAppender
时,非常确定Slf4J / Log4J会立即创建日志文件。
我认为您最好的选择是拥有2个不同且完整的Log4J配置,并根据您的命令行参数选择您在启动时加载的那个。
在PseudoCode中:
public static void main(String[] args){
//if log to file arg = true
DOMConfigurator.configure("logToFile.log4j.xml");
//else
DOMConfigurator.configure("logToConsoleOnly.log4j.xml");
}
修改强>
此外,如果您不喜欢维护两个配置文件的想法。您可以使用公共组件创建一个配置(可能是spring stuff和w / e else),然后根据您的参数,以编程方式配置FileAppender
:
public static void main(String[] args){
DOMConfigurator.configure("log4j.xml");
//if log to file arg = true{
// Define layout
PatternLayout layout = new PatternLayout();
layout.setConversionPattern("%d{ISO8601} %-5p %c{5} - %X{messageId} - %m%n");
// Create appender
FileAppender appender = new FileAppender();
appender.setFile("lss-client.log");
appender.setLayout(layout);
appender.activateOptions();
// Get root logger and add appender.
log = Logger.getRootLogger();
log.setLevel(Level.INFO);
log.addAppender(appender);
}
}