Java 如何配置log4j以启用/禁用文件日志记录?

Java 如何配置log4j以启用/禁用文件日志记录?,java,log4j,Java,Log4j,我已经编写了一个小型控制台实用程序。在整个应用程序中,我使用slf4j/log4j在开发控制台时将debug、trace和info语句记录到控制台中。现在我已经完成了开发并想要发布它,我想禁用控制台的所有输出,除了几个特定的记录器,并将所有剩余的记录器发送到一个文本文件 理论上,这应该是相当容易的。我已经创建了2个appender(一个ConsoleAppender和一个FileAppender)。我已将ConsoleAppender与控制台上需要的特定记录器和根级别的FileAppender关

我已经编写了一个小型控制台实用程序。在整个应用程序中,我使用slf4j/log4j在开发控制台时将debug、trace和info语句记录到控制台中。现在我已经完成了开发并想要发布它,我想禁用控制台的所有输出,除了几个特定的记录器,并将所有剩余的记录器发送到一个文本文件

理论上,这应该是相当容易的。我已经创建了2个appender(一个ConsoleAppender和一个FileAppender)。我已将ConsoleAppender与控制台上需要的特定记录器和根级别的FileAppender关联。这个很好用

我现在的问题是,如果我想完全禁用FileAppender,我想不出怎么做。如果我向FileAppender添加DenyAllFilter,它将阻止向文件写入任何内容,但仍然会创建文件。如果从根记录器中删除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,那么所有的记录器(我想转到标准输出和文件的记录器)都将关闭

有什么方法可以轻松做到这一点吗?理想情况下,我希望能够完全禁用文件追加器,但是如果需要,可以提供一个命令行开关来启用它

<?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>

谢谢


Eric

非常确定,在配置
文件附加器时,Slf4J/Log4J会立即创建日志文件

我认为您在这里的最佳选择是使用2种不同且完整的Log4J配置,并根据命令行参数选择在启动时加载的配置

在伪代码中:

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);
    }
} 

你能发布你的配置吗?我正试图想出一个这样的解决方案,但我遇到了一个问题。如果我仅以编程方式将fileAppender添加到根记录器,那么根记录器在默认情况下没有appender,并且我会收到log4j警告,表明它没有配置。(我可能可以通过创建第二个控制台appender来解决这个问题,该控制台appender上有一个拒绝过滤器,但这是一个难看的解决方案)。是否有一种方法可以访问log4j.xml中可能尚未与记录器关联的已配置Appender?这将减轻我以编程方式创建/配置它的需要,而只是将其关联起来。例如:类似Appender.findByName(“FILE_Appender”),但我似乎找不到一个方法来提供访问权限。getRootLogger().getAllAppenders()将只返回已与rootLogger关联的附加程序的枚举。据我所知,这是不可能的。正如我最初所说的,我非常确定Log4J会在配置
FileAppender
后立即创建日志文件。因此,如果您甚至不希望日志文件出现在那里,我认为您最好的选择是在启动时配置
FileAppender
。这一点很好。在此期间,我一直在浏览DOMConfigurator代码,事实上,这看起来不太可能。appender似乎只在使用时才被解析,因此如果没有使用appender的记录器,那么它们将被忽略。我可以确认,只要解析了appender,甚至在任何日志记录发生之前,就已经创建了该文件。