将文件名设置为log4j2的testNG类名?

时间:2017-09-22 04:47:32

标签: java testng slf4j log4j2

我正在开发一个自动化框架,我正在使用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);
    }
}
我觉得很难看。有没有更好的方法呢?

0 个答案:

没有答案