java - 将 Log4J 与 JUnit 和 Gradle 一起使用
问题描述
我有一个带有 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)
在我的 log4j xml 文件中,我有这个附加程序:
<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/
目录。我想我可以使用源文件夹中的日志目录,但我不能在 log4j xml 文件中更改它,因为当项目实际运行时,它不会正确记录。
知道如何纠正这个问题吗?
解决方案
如果我的理解是正确的,您可以在运行容器JUnit
的主机上运行测试。Tomcat
如果您只需要访问../app/logs
容器目录中的日志文件,那么您可以创建带有卷的 docker 容器。例如使用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/' ]
...
}
它将在主机和容器之间共享日志,JUnit
测试将能够读取它们。希望能帮助到你
推荐阅读
- c# - 使用正则表达式匹配带有某些字母的单词
- apache-kafka - 带有窗口连接的 Kafka 流数据的初始加载
- casting - 从二进制文件中获取 long int
- neo4j - Neo4j apoc.periodic.repeat 不适用于streams.publish
- c# - 如何在 ValidationHtmlAttributeProvider 中的 AddValidationAttributes 期间获取父对象?
- c++ - 如何在 C++ 中正确创建/实现拦截器库?
- python - keras 中的自定义损失函数会引发错误
- symfony - Symfony OneToMany 与关联数组:插入新行而不是更新
- c# - 当逗号紧跟在引号之后时,正则表达式不起作用
- sql - 无法在 DataGridView 中隐藏列