【问题标题】:How to configure log4j to enable/disable logging to a file?如何配置 log4j 以启用/禁用对文件的日志记录?
【发布时间】:2023-04-04 02:25:01
【问题描述】:

我编写了一个小型控制台实用程序。在整个应用程序中,我在开发时使用 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>

谢谢!

埃里克

【问题讨论】:

  • 你能发布你的配置吗?

标签: java log4j


【解决方案1】:

当您配置 FileAppender 时,相当肯定 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");
}

编辑

此外,如果您不喜欢维护两个配置文件的想法。您可以使用通用组件(可能是弹簧材料和其他组件)创建一个配置,然后根据您的参数,以编程方式配置 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 添加到 Root 记录器,则 Root 记录器默认没有附加程序,并且我收到 log4j 警告它未配置。 (我可能可以通过创建第二个带有拒绝过滤器的控制台附加程序来解决这个问题,但这是一个丑陋的解决方案。
  • 您最初可以将 Root Logger 配置为使用 NullAppenderlogging.apache.org/log4j/1.2/apidocs/org/apache/log4j/varia/…
  • 有没有办法可以访问我的 log4j.xml 中可能尚未与记录器关联的已配置 Appender?这将减轻我以编程方式创建/配置它的需要,但只是将它关联起来。例如:像 Appender.findByName("FILE_APPENDER") 之类的东西,但我似乎找不到可以让我访问的方法。 getRootLogger().getAllAppenders() 将仅返回已与 rootLogger 关联的附加程序的枚举。
  • 据我所知,这是不可能的。就像我最初所说的那样,我很确定 Log4J 会在配置 FileAppender 后立即创建日志文件。所以如果你甚至不想要那里的日志文件,我认为你最好的选择是在启动时配置FileAppender
  • 好点。与此同时,我一直在浏览 DOMConfigurator 代码,实际上,它看起来不太可能。附加器似乎只在使用时被解析,所以如果没有使用附加器的记录器,它们就会被忽略。而且我可以确认该文件是在解析附加程序后立即创建的,甚至在任何日志记录发生之前。
猜你喜欢
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 2019-03-14
  • 2020-04-09
  • 2015-06-24
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多