当前位置: 首页 > 知识库问答 >
问题:

在apachelog4j中,有没有一种方法可以简单地动态创建多个日志文件,而不是附加到一个日志文件中?

公德明
2023-03-14

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

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

logoutput1
logoutput2
logoutput3
..etc

每个日志文件只有一行。

我正在从事一个项目,我想实现一些自主能力——想法是我们可以有第三个外部运行的程序,它可以读取这些日志文件(然后根据它们做出反应)

使用Log4j可以实现这一点吗?如何做到这一点?谢谢

共有2个答案

戈曾琪
2023-03-14

编写自己的日志文件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>
西门旻
2023-03-14

是的,您可以使用RoutingAppender。有关详细信息,请参阅此问题:Log4j2:为多个日志动态创建日志文件

 类似资料:
  • 问题内容: 我当前正在创建一个可以包含模块的系统(将它们视为插件),其中每个模块可以拥有自己的专用日志。 我想使用log4j2项目进行日志记录,但是文件附加器似乎有些麻烦。 主项目(整个模块的模块加载器和“核心”)应具有自己的日志文件,而模块应具有自己的日志文件(如)。 通过阅读有关追加程序的文档,我发现了该类,并且我将使用它。直到我发现不能简单地将追加器添加到由创建的默认记录器中。 LogMan

  • 我目前正在创建一个系统,可以有模块(把它们看作插件),其中每一个都可以有自己的日志,专用的。 我想使用log4j2项目进行日志记录,但我似乎在文件附加符方面遇到了一些麻烦。 主项目(模块加载器和整个事情的“核心”)应该有自己的日志文件,而模块应该有自己的日志文件(像)。 即使搜索也没有给我提供任何接近的解决方案,我找到的只是xml配置中预定义的文件日志--这不是我想要的。 感谢你的阅读;即使是最轻

  • 问题内容: 我们想使用Winston来登录Node.js。但是,我们无法弄清楚如何拥有两个日志文件:一个仅用于错误,另一个用于其他所有文件。 天真的方法行不通,但是:添加多个传输会出错。 其他人则遇到了这个问题,暗示着解决方案的含糊,但没有真正的答案。 有任何想法吗? 问题答案: 我刚刚发送了一个请求请求,该请求允许在一个记录器中使用多个文件传输。 https://github.com/flati

  • 我有一个多节点集群星火集群。我正在使用log4j创建日志。日志只创建集群中的所有节点。它们也是在/tmp目录中创建的,而不是在任何其他目录中创建的。这是

  • 演示Java文件: 朋友们,请复习一下,让我知道里面的问题。请不要标记它重复,因为我已经尝试了可用的解决方案。可能是我错过了一些:)

  • 目前我正在使用Spring Boot日志,我正在通过属性文件配置它,下面是示例日志属性 问题是日志文件备份格式是. gz格式,就像logT一样est.log.2019-06-14.0.gz 如何排除默认的拉链? 我不想在xml文件中硬连线配置并将其放在资源文件夹中。我只能将滚动appender配置xml文件,但我想在属性文件中创建日志文件路径,这样我就可以为不同的环境动态设置它。 有没有办法实现这