我想在我的网络应用程序中有两个Log4j配置文件。 我放在这里的第一个: conf / main / log4j.properties
第二个是: conf / test / resources / log4j-test.properties
所以我的pom包含以下内容:
<build>....
<resources>
<resource>
<directory>conf/main</directory>
<filtering>true</filtering>
<includes>
<include>*.properties</include>
</includes>
</resource>
</resources>
<testResources>
<testResource>
<directory>conf/test/resources</directory>
<filtering>true</filtering>
<includes>
<include>*.properties</include>
</includes>
</testResource>
</testResources>
.......
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8.1</version>
<configuration>
<systemPropertyVariables>
<log4j.configuration>file:${project.build.testOutputDirectory}/log4j-test.properties</log4j.configuration>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
.....
log4j.properties:
log4j.rootLogger=INFO, stdout, mainFile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.mainFile=org.apache.log4j.RollingFileAppender
log4j.appender.mainFile.File=../logs/main.log
log4j.appender.mainFile.MaxFileSize=1MB
log4j.appender.mainFile.MaxBackupIndex=1
log4j.appender.mainFile.layout=org.apache.log4j.PatternLayout
log4j.appender.mainFile.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
和log4j-test.properties:
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
我的目标 - 将测试日志仅写入我的控制台。 例如,我有一个简单的测试方法:
@Test(dataProvider = "invalidCredentials", threadPoolSize = 10, invocationCount = 1, invocationTimeOut = 1000)
public void testGetUserByLoginInvalid(String login, String password) {
LDAPUser user = LdapUtils.getUserByLogin(login, password);
assertNull(user);
}
类LdapUtils具有记录器定义:
private static final Logger logger = Logger.getLogger(LdapUtils.class);
它可以写一些信息消息:
public static LDAPUser getUserByLogin(String login, String password) {
....
if (user == null) {
logger.info(INVALID_USER + login);
return null;
}
.....
}
所以问题是:当我执行Maven安装(或简单地 - 测试)时,它工作正常,因为它从正确的位置读取log4j配置(conf / test / resources / log4j-test.properties)并且只写入文件,仅控制台。
但是当我试图在IntellijIDEA中运行这个测试方法时(右键单击testGetUserByLoginInvalid方法并选择Run“testGetUserByLoginInvalid()”)它失败了
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: ..\logs\main.log (The system cannot find the path specified)
在这种情况下,它会读取错误的配置(log4j.properties而不是log4j-test.properties)并在尝试查找.. \ logs \ main.log文件时失败
log4j.appender.mainFile.File = .. / logs / main.log
如果是网络应用程序,它似乎与
相同log4j.appender.mainFile.File = $ {的catalina.home} /logs/main.log
但测试根本不需要了解$ {catalina.home},不是吗?因为他们不是.war的一部分。所以我的想法是为测试创建自己的log4j配置,但是我不能避免在运行测试而不是使用Maven而是使用IDEA读取错误的配置时出现这个问题,如上所述......
任何想法都是谁?或者可能有另一种方法可以做我想要的事情?...提前非常感谢你!
答案 0 :(得分:2)
我通过以下方式解决 $ {catalina.home} 的问题:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<systemProperties>
<property>
<name>catalina.home</name>
<value>${project.build.directory}</value>
</property>
</systemProperties>
</configuration>
</plugin>