使用相同对象将不同级别记录到不同文件

时间:2016-09-25 09:58:48

标签: java xml logging log4j rollingfileappender

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

我尝试搜索问题的解决方案。其中一个链接Creating multiple log files of different content with log4j表示关于"阈值"我甚至尝试在我的xml配置文件中添加阈值。但它实际上是这样做的:信息日志正在myLog.info文件中打印,但错误日志会打印在两个文件中。可以单独通过xml配置文件完成,还是需要单独的属性文件?如果xml文件足够,那么需要做什么?

我更喜欢在属性文件上使用xml文件。如果只有使用xml配置文件的工作解决方案,那就足够了。提前谢谢。

1 个答案:

答案 0 :(得分: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>

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

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