我在多个线程上运行我的TestNG测试(同时在多个设备上进行Appium测试),并希望在不同文件的不同线程上编写测试日志。这里的线程是在测试流程开始之前自动创建的。
所以我想以编程方式创建单独的appender和单独的logger,以便每个appender只附加到它自己的线程,然后在一个线程中创建的logger只会在该线程中创建appender。
请让我知道如何逐步实现它。
答案 0 :(得分:0)
首先,这感觉就像XY Problem,特别是因为您没有提供任何理由来说明您希望采用程序化解决方案。
可以逐个线程地实现单独的日志文件,而无需以编程方式创建记录器和追加器。由于我认为这是一个更优化的解决方案,因此我将提供一个如何完成它的演示。
<强>解释强>
此解决方案将使用RoutingAppender和ThreadContext为每个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>