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

时间:2017-05-01 11:37:15

标签: multithreading logging testng log4j2

我在多个线程上运行我的TestNG测试(同时在多个设备上进行Appium测试),并希望在不同文件的不同线程上编写测试日志。这里的线程是在测试流程开始之前自动创建的。

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

请让我知道如何逐步实现它。

1 个答案:

答案 0 :(得分:0)

首先,这感觉就像XY Problem,特别是因为您没有提供任何理由来说明您希望采用程序化解决方案。

可以逐个线程地实现单独的日志文件,而无需以编程方式创建记录器和追加器。由于我认为这是一个更优化的解决方案,因此我将提供一个如何完成它的演示。

<强>解释

此解决方案将使用RoutingAppenderThreadContext为每个Person person = new Person {Name = "Jimmy"}; foreach(var phone in Phone_Number_In_Posted_Form){ person.PhoneNumbers.Add(new PhoneNumber {Number = phone}); } Db.Add(person); Db.SaveChanges(); 创建追加者。下面的示例将使用简单的Thread,但您可以非常轻松地交换FileAppender。由于您没有声明您有任何要求为每个线程使用不同的日志级别,因此以下示例将不会实现此功能。最后,该示例不会使用TestNG,因为它有一些设置开销;相反,将使用一个带有main的简单类来创建两个线程。

示例实施

log4j2.xml文件:

RollingFileAppender

使用2个并发线程生成日志的Java类:

<?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>