在Apache Log4J中,有没有办法简单地动态创建多个日志文件,而不是附加到一个日志文件?

时间:2015-06-01 02:03:19

标签: java logging log4j log4j2

我有一个程序,我希望能够将每条日志消息分成自己的日志文件。

因此,如果该类在单个程序执行中生成10个ERROR日志和10个DEBUG日志,那么应该创建20个日志文件,并且它们的名称理想情况下可以是类似的:

logoutput1
logoutput2
logoutput3
..etc

每个日志文件只有一行。

我正在开展一个项目,我希望实现一些自主能力 - 我们的想法是我们可以拥有第三个外部运行的程序,可以读取这些日志文件(然后根据需要做出反应)在他们身上)

Log4j可以实现吗?如何才能做到这一点 ? 谢谢!

2 个答案:

答案 0 :(得分:4)

是的,您可以使用RoutingAppender。有关详细信息,请参阅此问题:Log4j2: Dynamic creation of log files for multiple logs

答案 1 :(得分:4)

编写自己的日志文件Appender并在每次尝试写入某些日志时创建一个新文件。以下代码可能会对您有所帮助。

public class SingleLogMsgFileAppender extends FileAppender {

    private String file = null;

    private static long fileNo;

    public SingleLogMsgFileAppender() {
        super();
        fileNo = 1;
    }

    @Override
    protected void subAppend(LoggingEvent event) {
        createNewFile(true);
        synchronized (this) {
            super.subAppend(event);
        }
    }

    @Override
    public void setFile(String file) {
        this.file = file;
        createNewFile(false);
    }

    public void createNewFile(boolean incrementFileNo) {
        try {
            String fileName = file + "testlogfile." + fileNo + ".log";
            super.setFile(fileName);
            super.activateOptions();
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (incrementFileNo) {
            fileNo++;
        }
    }

}

这是log4j配置文件

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="CustomAppender" class="loga.randd.threads.log4j.SingleLogMsgFileAppender">
        <param name="File" value="log/" />
        <param name="Append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{MM_dd_yyyy HH_mm_ss}%m%n" />
        </layout>
    </appender>

    <root>
        <priority value="debug" />
        <appender-ref ref="CustomAppender" />
    </root>

</log4j:configuration>