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

如何在log4j2中实现多文件追加

董砚
2023-03-14
public class MultiFileAppender extends AppenderSkeleton {
    ...

@Override
    protected void append(LoggingEvent event) {
     ...
}
@Override
    public void close() {
}
@Override
    public boolean requiresLayout() {
     ...
 }
}

在log4j.xml中追加内容:

<appender name="TEST_MULTIFILE" class="com.test.it.logging.MultiFileAppender">
<param name="File" value="${LOGS}/test/test_%id%.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="5"/>
<param name="Encoding" value="UTF-8"/>
</appender>

如何在java中获取这些参数,并像在log4j2中的上述配置一样创建多文件追加器?请帮帮忙。多谢了。

共有1个答案

梁丘钊
2023-03-14

采取以下方案:

一个类被实例化几次,每个实例都有不同的id。相应id的日志记录应该转到它自己的文件中。每个ID有一个文件。在编写代码时(在本例中,当然是在编写main类时)不知道id的值。

public class Test implements Runnable {
    private static final Logger LOG = LogManager.getLogger();
    private final String id;

    public Test(String id) {
        this.id = id;
    }

    @Override
    public void run() {
        ThreadContext.put("id", id);    //org.apache.logging.log4j.ThreadContext
        while (true) {
            try { Thread.sleep(10000); } catch (InterruptedException e) { break; }
            LOG.info("{}: I have been sleeping for 10 seconds", id);
        }
    }
}
public class Main {
    private static final Logger LOG = LogManager.getLogger();

    public static void main(String[] args) {
        LOG.info("Starting thread 1");
        Thread t1 = new Thread(new Test("mode1"));
        t1.start();
        LOG.info("Starting thread 2");
        Thread t2 = new Thread(new Test("mode2"));
        t2.start();
        LOG.info("Starting thread 3");
        Thread t3 = new Thread(new Test("mode3"));
        t3.start();
    }
}

下面是log4j2的配置。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <Appenders>
        <Routing name="Routing">
            <Routes pattern="$${ctx:id}">
                <!-- If a special id should be treated differently
                <Route key="mymode">
                    ...
                </Route> -->
                <!--  Threads that don't have the id value set -->
                <Route key="$${ctx:id}">
                    <File name="File"
                            fileName="normal.log">
                        <PatternLayout pattern="%d{HH:mm:ss} [%p] %c %msg%n" />
                    </File>
                </Route>
                <!-- Threads with the id value set, and is not one of the special ones above -->
                <Route>
                    <File name="File-${ctx:id}"
                            fileName="id-${ctx:id}.log">
                        <PatternLayout pattern="%d{HH:mm:ss} [%p] %c %msg%n" />
                    </File>
                </Route>
            </Routes>
        </Routing>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Routing" />
        </Root>
    </Loggers>
</Configuration>
 类似资料:
  • 我是unix新手。我有下面的log4j2配置文件。当我在unix环境中使用此文件时,文件应用程序。未创建日志。有人能告诉我如何在unix环境中将日志重定向到文件吗

  • 类似地,我们如何在log4j2中创建自定义的appender,因为我们没有AppenderSkelton类要扩展,而所有其他appender都扩展AppenderBase类。

  • 问题内容: 我发现os.Open()返回O_RDONLY文件,而os.Create()返回O_RDWR,但是找不到方法返回APPEND文件指针。 有什么帮助吗? 问题答案: 该OpenFile需要一个标志参数,您可以使用: 与O_CREATE一起使用,OpenFile还可以起到与os.Create()相同的作用。

  • 问题内容: 这是我需要帮助的功能: 原版的: 通缉: 问题答案: 以下完整示例将从当前目录中读取 现有 文件,追加新服务器,然后将文件重写为。没有现有的.xml文件,该功能将无法正常运行,因此您需要修改代码以处理这种情况。 示例 server.xml 文件: 对代码的主要更改是 未 创建新的“ root”元素。上面的示例仅使用现有节点中的当前根节点,然后追加一个新的 Server 元素并重新写入该

  • 如果我在application.properties文件中指定“Logging.config=src/main/resources/log4j2.properties”,日志记录就可以正常工作。 spring boot自动检测log4j2.properties而不需要在application.properties文件中指定“logging.config=src/main/resources/log

  • 我的log4j2属性文件如下所示- 当我试图使用以下代码访问appender时 它将条目记录在SeriesIn响应appender中,而不是ejdk appender中。我的log4j2有多个自定义appender。我需要在不同的类文件中使用不同的appender,它应该将条目记录在正确的文件中。