我正在开发一个自动化框架,我正在使用slf4j(版本1.7.21)。
我希望能够将每个测试类的日志写入自己的文件中。我是log4j2的新手,这是我到目前为止所尝试过的。
我读到要动态设置文件名,我们应该在我的类中的静态块中设置一个系统属性,然后使用该属性在我的log4j2-test.xml中设置文件名。
这就是我班级的样子:
public class TestClass {
Logger log;
static {
System.setProperty("logFilename", "TestClass");
log = LoggerFactory.getLogger(TestClass.class);
}
@Test
public static void testLogger() {
log.info("Testing logger");
}
}
我的log4j2.xml看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" name="Regressions">
<Properties>
<Property name="logs.dir">logs</Property>
<Property name="pattern">%d %-5p - [%logger] ~ %m (%c{1.}:%L)%n</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${pattern}"/>
</Console>
<File name="All" fileName="${sys:logs.dir}/${sys:logFilename}.log" append="false">
<PatternLayout pattern="${pattern}"/>
</File>
<File name="Debug" fileName="${sys:logs.dir}/${sys:logFilename}-DEBUG.log" append="false">
<PatternLayout pattern="${pattern}"/>
</File>
<File name="Error" fileName="${sys:logs.dir}/${sys:logFilename}-ERROR.log" append="false">
<PatternLayout pattern="${pattern}"/>
</File>
</Appenders>
<Loggers>
<Logger name="org.apache.http" level="DEBUG" additivity="false">
<AppenderRef ref="Debug"/>
</Logger>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="All"/>
</Root>
</Loggers>
当每个测试类中有静态块时,效果很好。
现在,我想在基础测试类中执行此操作。这就是问题所在。我尝试了以下事项:
1)在基类中获取类名:
public class BaseClass {
String testClass = this.getClass().getSimpleName();
}
但由于它是一个静态块,我不能称之为。
2)另一种方法是在基类中有一个单独的方法来创建记录器:
public class TestClass {
Logger log = BaseClass.getLogger(TestClass.class);
}
public class BaseClass {
public static Logger getLogger (Class className) {
System.setProperty("logFilename", className.getSimpleName());
return LoggerFactory.getLogger(className);
}
}
我觉得很难看。有没有更好的方法呢?