[英]Separate Log4j 2 instances for each web apps in Tomcat 9
我在我的應用程序中使用 Log4j 2 作為日志框架,並在 Tomcat 9.0.54 上運行它。 現在,如果我部署同一應用程序的 2 個實例,它會為第一個創建 Log4j 實例,所有日志都會轉到第一個應用程序的日志文件。
例如, Tomcat/webapps
有 2 個文件夾,即
APP1
APP2
兩者下都有日志文件夾,但日志僅在 APP1/logs 中創建,並且兩個應用程序的日志都在那里更新。
我嘗試從 Java 配置它。
System.setProperty("log4j.configurationFile", Class.forName("com.example.MyAppListener").getResource("/log4j2.xml").toString());
LoggerContext context = (LoggerContext) LogManager.getContext(false);
if(!context.isInitialized()) {
context.initialize();
}else {
context.reconfigure();
}
我嘗試調試 Log4j 2 源,似乎是在初始化上下文時,兩個應用程序都采用相同的配置位置。 看起來 ClassLoader 正在加載單個上下文 object 在 Tomcat 服務器級別。
還有 web.xml
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/log4j2.xml</param-value>
</context-param>
兩者的行為相同
此外,Log4j 2 jars 分別部署在每個應用程序的 WEB-INF/lib 文件夾中。
實際上,問題出在configLocation
。 當我嘗試獲取上下文時, configLocation
屬性設置為 null,log4j 在初始化用於第一個應用程序記錄器上下文的上下文時加載了相同的配置 object,其configuration
屬性具有第一個應用程序的configLocation
。 我修改了我的代碼以明確地向上下文 object 提供configLocation
並且它有效。
URL configLocation = Class.forName("com.example.MyAppListener").getResource("/log4j2.xml");
LoggerContext context = (LoggerContext) LogManager.getContext(false);
context.setConfigLocation(configLocation.toURI());
if(!context.isInitialized()) {
context.initialize();
}else {
context.reconfigure();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.