这个问题似乎非常简单,但我花了几个小时试图解决它,但一无所获。
我已经使用 Selenium 和 Testng 构建了一个测试框架。我有一个基类,它可以扩展到创建的任何测试类,并且该基类负责几个不同的功能,其中之一是创建一个唯一命名的目录,我在其中存储测试的屏幕截图。这个功能运行良好。问题是我现在正在尝试将 log4j2 集成到测试框架中,我想要的是将这些日志写入每次运行时创建的这个唯一目录内的文件中。这是我的 log4j2.xml 的样子:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="30">
<Properties>
<Property name="logFilename">${sys:logFileName}</Property>
</Properties>
<Appenders>
<File name="File" fileName="${logFilename}">
<PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="File" />
</Root>
</Loggers>
</Configuration>
如您所见,我正在尝试使用属性
${sys:logFileName}
,其中 logFileName
在我的基类中定义如下:
// Seting the log file path programmatically
// resultsDirName is the path to the unique directory that is being created
// at the start of each test.
String logFilePath = resultsDirName + "/test.log";
System.out.println(logFilePath);
System.setProperty("logFileName", logFilePath);
当我运行测试时,出现以下错误:
ERROR StatusConsoleListener FileManager (../${sys:logFileName}) java.io.IOException: The filename, directory name, or volume label syntax is incorrect
java.io.IOException: The filename, directory name, or volume label syntax is incorrect
我知道路径是正确的,因为正在创建目录并且我成功地将屏幕截图保存在那里。同样重要的是要注意,在创建这些 sys 变量之前我不会初始化记录器。我尝试了一些其他的事情,取得了一些意想不到的结果。例如,如果我将 log4j2.xml 更改为包含以下行:
<Property name="logFilename">${logFileName}</Property>
我最终在项目根目录中创建了一个日志文件,该文件实际上称为 ${logFileName}。
我还在我的 xml 中尝试了以下内容:
<Property name="logDirectory">${logDirectory}</Property>
<Property name="logFilename">${logDirectory}/test.log</Property>
</Properties>
这实际上是创建一个名为
${logDirectory}
的目录并在其中存储日志文件。我也收到此错误:
WARN StatusConsoleListener Infinite loop in property interpolation of logDirectory
我觉得自己像个十足的傻瓜。我正在用 python 构建一个类似的测试框架,并且实现此功能的问题为零。我不明白为什么这在Java中如此困难和复杂,或者可能只是因为我在Java方面更像是新手。请您提供任何帮助,我们将不胜感激。
我还没有真正使用过 log4j2,但我想你更喜欢使用编程配置。此处描述:https://logging.apache.org/log4j/2.x/manual/customconfig.html