java - 用于调试和测试的 Log4j 配置

标签 java unit-testing maven intellij-idea log4j

我想在我的网络应用程序中有两个 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,正如我上面描述的那样......

有人知道吗?或者可能有另一种方法来做我想做的事?...在​​此先感谢您!

最佳答案

我通过以下方式解决了 ${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>

关于java - 用于调试和测试的 Log4j 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12180769/

相关文章:

java - 在JAVA中从图像文件夹访问图像

java - 将 MySQL json 列映射到 JPA 会引发错误

javascript - 如何使用 jasmine 测试具有依赖关系的 Angular 服务?

c# - 在 ASP.NET MVC 单元测试中使用 Moq 模拟函数时无法返回非空字符串

unit-testing - 是否可以在MVC4中对BundleConfig进行单元测试?

maven - Aether 在运行时从存储库获取 Artifact

java - 运行 Spring Boot 应用程序时出现兼容版本问题,但在 pom 中只有版本

spring - Maven 依赖 - org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Properties 上的 NoSuchMethodError

java - 在线程中调用地理编码器构造函数时,连接崩溃

java - 如何在java中禁用按钮3秒