【问题标题】:Logging different levels using same object to different files使用相同对象将不同级别记录到不同文件
【发布时间】:2017-02-02 18:40:35
【问题描述】:

我的简单问题是:如果我在 Java 中有两个语句,例如 logger.info() 和 logger.error()(使用 log4j),我希望将这两行的结果打印在两个单独的文件中。也就是说, logger.info(...) 应该打印到一个文件说 myLog.info 和 logger.error(...) 应该打印到 myLog.error 文件。我正在为此任务使用滚动文件附加程序。此外,我只想要一个记录器对象来完成任务。有人可能会建议每个文件使用两个或多个不同的记录器,但事实并非如此。

我尝试寻找问题的解决方案。 Creating multiple log files of different content with log4j 的链接之一说“阈值”,我什至尝试在我的 xml 配置文件中添加阈值。但它实际上在做什么:信息日志正在打印在 myLog.info 文件中,但错误日志被打印在两个文件中。可以单独通过xml配置文件完成还是需要单独的属性文件?如果xml文件足够了,那还需要做什么呢?

我更喜欢 xml 文件而不是属性文件。如果有一个仅使用 xml 配置文件的工作解决方案,那就足够了。提前致谢。

【问题讨论】:

  • 看看这是否有帮助.. stackoverflow.com/questions/9652032/…
  • @mhasan 实际上我正在寻找涉及 xml 配置文件的答案......但我也会尝试。谢谢
  • @mhasan 还有一件事,只是看了答案,我意识到它实际上是在制作两个不同的记录器...我只想要一个将不同级别的日志输出到不同文件的记录器。
  • log4j 1 @sazzad

标签: java xml logging log4j rollingfileappender


【解决方案1】:

您可以使用过滤器来拒绝除您想要的级别之外的任何消息。以下是如何执行此操作的示例:

首先测试我们的努力:

package test;
import org.apache.log4j.Logger;

public class Main {

    private static final Logger logger = Logger.getLogger(Main.class);
    public static void main(String[] args) {
        logger.debug("here's some debug");
        logger.info("here's some info");
        logger.warn("here's some warn");
        logger.error("here's some error");
        logger.fatal("here's some fatal");
    }

}

接下来是一个 log4j.xml 配置文件来设置 appender 和 loggers:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p  [%c{1}] %m %n" />
        </layout>
    </appender>

    <appender name="debugLog" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="logs/debug.log" />
        <param name="Append" value="true" />
        <param name="MaxFileSize" value="5000KB" />
        <param name="maxBackupIndex" value="5" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %m%n" />
        </layout>

        <filter class="org.apache.log4j.varia.LevelMatchFilter">
            <param name="LevelToMatch" value="DEBUG" />
            <param name="AcceptOnMatch" value="true" />
        </filter>

        <filter class="org.apache.log4j.varia.DenyAllFilter" />
    </appender>

    <appender name="infoLog" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="logs/info.log" />
        <param name="Append" value="true" />
        <param name="MaxFileSize" value="5000KB" />
        <param name="maxBackupIndex" value="5" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %m%n" />
        </layout>

        <filter class="org.apache.log4j.varia.LevelMatchFilter">
            <param name="LevelToMatch" value="INFO" />
            <param name="AcceptOnMatch" value="true" />
        </filter>

        <filter class="org.apache.log4j.varia.DenyAllFilter" />
    </appender>

    <logger name="test" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="consoleAppender" />
        <appender-ref ref="debugLog" />
        <appender-ref ref="infoLog" />
    </logger>
</log4j:configuration>

此模式将允许您为每个日志级别生成单独的日志,只需重复我为调试或信息日志提供的配置即可。请注意,控制台附加程序将接受所有级别。

我能够从 this post 获得一些见解,所以我认为我应该给予表扬。

【讨论】:

  • 我搜索了解决方案,但没有提到使用级别匹配过滤器的方式。这个效果很好。谢谢。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
相关资源
最近更新 更多