Web アプリケーションに 2 つの Log4j 構成ファイルが必要です。ここに最初に配置したもの: conf/main/log4j.properties
2 番目はここにあります: 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.プロパティ:
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-test.properties ではなく log4j.properties) を読み取り、..\logs\main.log ファイルを見つけようとすると失敗します。
log4j.appender.mainFile.File=../logs/main.log
Webアプリケーションの場合、それはまったく同じようです
log4j.appender.mainFile.File=${catalina.home}/logs/main.log
しかし、テストは ${catalina.home} について何かを知る必要はまったくありませんね。それらは .war の一部ではないためです。したがって、私の考えは、テスト用に独自のlog4j構成を作成することでしたが、上記で説明したように、MavenではなくIDEAでテストを実行するときに間違った構成を読み取るというこの問題を回避することはできません...
何かアイデアはありますか?それとも、私がやりたいことを行う別の方法があるのでしょうか?... よろしくお願いします!