如何在log4j2中实现多文件appender [英] How to implement multi file appender in log4j2

查看:273
本文介绍了如何在log4j2中实现多文件appender的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将我的应用程序从 log4j 迁移到 log4j2 。请在下面找到从应用程序当前线程获取输入(比如模式是 mode1 )的类,并将其附加到日志文件名(例如 log_mode1。 log )并创建appender并更新日志文件。

I am migrating my application from log4j to log4j2. Please find below the class which takes input (say mode is mode1) from the application current thread and appends it to the log file name (say log_mode1.log) and creates the appender and updates the log files.

Class:

public class MultiFileAppender extends AppenderSkeleton {
    ...

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

log4j.xml中的appender内容:

<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中获取这些参数并创建多文件appender,如log4j2中的上述配置?请帮忙。谢谢。

How to get these parameters in java and create multi file appender like the above configuration in log4j2 ? Please help. Thanks.

推荐答案

采取以下方案:

一个类是每个实例使用不同的id实例化几次。记录相应的id应该转到它自己的文件。每个id一个文件。编写代码时,id的值是未知的(当然是在本例中编写 Main 类时)。

A class is instantiated several times with a different id for each instance. Logging for respective id should go to it's own file. One file for each id. The values for id is not known when writing the code (it of course is when writing the Main class in this example).

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的配置。


The following is the configuration for 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>






这个想法取自 log4j2 FAQ 。另请参阅查询

如果您仍然需要让自定义appender与log4j2一起使用,可能这个带答案的问题为您提供了一些关于如何继续进行的好提示。

If you still need to get your custom appender to work with log4j2, maybe this question with answer gives you some good hints on how to proceed.

这篇关于如何在log4j2中实现多文件appender的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆