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

如何为多个线程以编程方式创建单独的Log4j2滚动文件附加器和记录器

轩辕华辉
2023-03-14

因此,我希望以编程方式创建单独的appender和单独的logger,以便每个appender只附加到它自己的线程,然后在一个线程中创建的logger只在该线程中创建appender。

请让我知道如何一步步实现。

共有1个答案

万明辉
2023-03-14

首先,这感觉像是一个XY问题,特别是因为您没有提供任何理由来说明为什么要使用编程解决方案。

可以在一个线程一个线程的基础上实现单独的日志文件,而不需要以编程方式创建记录器和附加器。由于我相信这是一个更优化的解决方案,我将提供一个演示如何可以这样做。

解释

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Routing name="MyRoutingAppender">
            <Routes pattern="$${ctx:threadName}">
                <Route>
                    <File
                        fileName="logs/${ctx:threadName}/log.txt"
                        name="appender-${ctx:threadName}">
                        <PatternLayout>
                            <Pattern>[%date{ISO8601}][%-5level][%t] %m%n</Pattern>
                        </PatternLayout>
                    </File>
                </Route>
            </Routes>
        </Routing>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="[%date{ISO8601}][%-5level][%t] %m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="Thread" level="TRACE" additivity="false">
            <AppenderRef ref="STDOUT" />
            <AppenderRef ref="MyRoutingAppender" />
        </Logger>
        <Root level="WARN">
            <AppenderRef ref="STDOUT" />
        </Root>
    </Loggers>
</Configuration>
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class MultiThreadLog4j2SepFilesMain {
    //Create a lock to use for synchronizing the getting of the logger
    private static final Object lock = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable(){

            public void run() {
                //Set up the context before getting logger
                ThreadContext.put("threadName", Thread.currentThread().getName());

                //Get the logger for this thread
                Logger log = null;
                synchronized(lock){
                    log = LogManager.getLogger(Thread.currentThread().getName());
                }

                //Generate some logs
                log.info("here's the first thread");

                //Wait a while so that threads interleave
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //Generate more logs
                log.debug("some debug in first thread");
                log.info("finishing first thread");

            }}, "Thread.1"); //Use a name that will allow us to use Thread.getName when getting the logger inside the thread

        Thread t2 = new Thread(new Runnable(){

            public void run() {
                //Set up the context before getting logger
                ThreadContext.put("threadName", Thread.currentThread().getName());

                //Get logger for this thread
                Logger log = null;
                synchronized(lock){
                    log = LogManager.getLogger(Thread.currentThread().getName());
                }

                //Generate some logs
                log.info("here's the second thread");
                log.debug("some debug in second thread");

            }}, "Thread.2"); //Use a name that will allow us to use Thread.getName when getting the logger inside the thread

        //Start both threads
        t1.start();     
        t2.start();
    }
}
 类似资料:
  • 我试图创建一个完全独立的第二个上下文/配置/记录器-而不是现有配置/上下文中的记录器。日志消息将发送到STDOUT。 当前代码 上面的.error()调用转到标准输出。请注意,我尝试使用reconfigure()而不是initialize(),但这会打乱我的原始配置。 当我打印出来时,记录器似乎是错误的,它们的名称和上下文似乎是正确的,但处于错误级别。还有一些事情要做,不要做附加物。 从生成器生成

  • 据我所知,log4j2中的RollingFileAppender不会在指定的时间(比方说-在一小时结束时)回滚,而是在超过时间阈值后到达的第一个日志事件时回滚。 有没有一种方法可以触发一个事件,一方面会导致文件滚动,另一方面不会附加到日志中(或者会附加一些无关紧要的东西,比如空字符串)?

  • 我正在使用log4j2 v2.17.2,需要在运行时以编程方式添加记录器/附加器。我正在创建LoggerConfig,如下所示:https://logging . Apache . org/log4j/2 . x/manual/custom config . html部分:初始化后以编程方式修改当前配置 包括此片段: 当使用:LoggerConfig.createLogger(..)(现在我用构建

  • 我正在处理一个使用log4j2(使用log4j2.xml初始化参数)并加载记录器的应用程序。当应用程序运行时,我需要以编程方式重写一些参数,例如更改日志级别和滚动文件附加器属性。我可以使用以下方法更改日志级别: 现在我尝试使用RollingFile appender的属性来解决同样的问题。然而,我仍然停留在如何修改现有的RollingFile appender的属性上