Java 将Log4J与JUnit和Gradle一起使用

Java 将Log4J与JUnit和Gradle一起使用,java,unit-testing,docker,junit,log4j,Java,Unit Testing,Docker,Junit,Log4j,我有一个带有JUnit测试的Gradle项目,这些测试在项目构建时运行 该项目也已停靠。在docker容器中,项目使用Java和Tomcat运行 所有测试都通过,但控制台中出现错误: com.myapp.MyObjectTest > testGetData STANDARD_ERROR log4j:ERROR setFile(null,true) call failed. java.io.FileNotFoundException: /tomcat/website/webapps/app/

我有一个带有JUnit测试的Gradle项目,这些测试在项目构建时运行

该项目也已停靠。在docker容器中,项目使用Java和Tomcat运行

所有测试都通过,但控制台中出现错误:

com.myapp.MyObjectTest > testGetData STANDARD_ERROR
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /tomcat/website/webapps/app/logs/logFile.log (No such file or directory)
在我的log4jxml文件中,我有一个appender:

<appender name="rolling" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="/tomcat/website/webapps/app/logs/logFile.log" />
    <param name="MaxFileSize" value="1000KB" />
    <param name="MaxBackupIndex" value="2" />    
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{MMM dd HH:mm:ss} %F: %m%n" /> 
    </layout>
</appender>

JUnit测试中有使用日志文件引用的类

我明白为什么我会犯这个错误;这是因为JUnit测试在docker容器之外运行,所以它找不到
/tomcat/website/webapps/app/logs/
目录。我想我可以使用源文件夹中的logs目录,但是我不能在log4jxml文件中更改它,因为当项目实际运行时,它不会正确地记录


知道如何纠正这个问题吗?

如果我的理解正确,您可以在运行
Tomcat
容器的主机上运行
JUnit
测试。如果您只需要访问容器的
。/app/logs
目录中的日志文件,则可以创建具有卷的docker容器。例如:


它将在主机和容器之间共享日志,
JUnit
测试将能够读取日志。希望它能有所帮助

JUnit是在Gradle构建项目时运行的,无论是在我的本地机器上,还是通过Jenkins(我们的构建自动化工具)。在我使用Gradle构建项目后,该项目被停靠,因此docker容器还不存在。
task createBuildContainer(type: DockerCreateContainer) {
 doFirst {
    def hostPath = (file("/path/on/host")).getAbsolutePath()
}

 volumes = [ '/tomcat/website/webapps/app/logs/' ]
 binds = [ (hostPath) : '/tomcat/website/webapps/app/logs/' ]
...
}