我有一个配置为log4j的Web应用程序。在指定放置日志文件的路径时,此配置使用系统属性catalina.home。
现在,我正在准备集成junit测试套件,该套件将加载嵌入式码头并加载该Web应用程序(然后,我使用rest调用et all进行测试)。我的问题是,由于此Web应用程序现在是从码头catalina.home加载的,因此未预先指定系统属性,因此无法将日志文件存储在Windows C:/ logs / ...的根目录中。
我需要一种方法来指定从码头使用的catalina.home。最初我尝试使用:
System.setProperty("catalina.home", "target/jetty/tests/");
但这似乎被忽略了。
我无法弄清楚为什么上述方法不起作用以及如何使其起作用。有人可以在这里提出一些建议吗?有没有人遇到过同样的问题?
最佳答案
日志记录是一种特殊的野兽,它很早就初始化,通常是JVM在您的应用程序中初始化的第一件事。
您对System.setProperty("catalina.home", "target/jetty/tests/");
的使用可能太晚了,因为log4j可能在设置该属性之前就已经初始化。
为了获得最佳效果,您需要检查以下内容...
您的测试用例不应声明静态Logger实例
您的System.setProperty
应该出现在测试用例的static { }
块中
也许出于测试原因,您可以摆脱src/test/resources
(或log4j.properties
)文件的log4j.xml
替换(aka覆盖),并在那里指定备用日志目录路径。
奖励:您应该在Gradle或Maven环境中查找并使用${project.basedir}
和${basedir}
系统属性,并使用它们为您的System.setProperty()
调用创建完全限定的绝对路径,尤其是在您具有多模块的情况下构建,因为相对路径将始终来自${user.dir}
(aka PWD),并且在常规构建设置中不会更改。