Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在单个weblogic容器中为web应用程序分离log4j2文件_Java_Servlets_Classloader_Weblogic 10.x_Log4j2 - Fatal编程技术网

Java 在单个weblogic容器中为web应用程序分离log4j2文件

Java 在单个weblogic容器中为web应用程序分离log4j2文件,java,servlets,classloader,weblogic-10.x,log4j2,Java,Servlets,Classloader,Weblogic 10.x,Log4j2,我们设立了以下机构: 应用服务器:Weblogic 10.3.6 我们有2台托管服务器,在这两台托管服务器上部署了3个web应用程序。 所有log4j2 jar都保存在服务器库中,并在服务器启动时加载 现在,我们希望每个web应用程序都有自己的logj2配置,因为我们希望控制日志级别 我们使用web.xml中的log4j2-web.jar对每个web应用程序进行了单独的log4j2配置文件初始化,但我们注意到,当我们加载第一个web应用程序时,会加载log4j2配置文件,但当我们尝试加载第二个和

我们设立了以下机构:

应用服务器:Weblogic 10.3.6

我们有2台托管服务器,在这两台托管服务器上部署了3个web应用程序。 所有log4j2 jar都保存在服务器库中,并在服务器启动时加载

现在,我们希望每个web应用程序都有自己的logj2配置,因为我们希望控制日志级别

我们使用web.xml中的log4j2-web.jar对每个web应用程序进行了单独的log4j2配置文件初始化,但我们注意到,当我们加载第一个web应用程序时,会加载log4j2配置文件,但当我们尝试加载第二个和第三个web应用程序时,会加载它们各自的log4j配置xml,它不会加载新的配置文件,但会设置首先部署的第一个web应用程序的log4j2配置

我试着调试相同的程序,并得出这样的结论:由于log4j2 jar存在于服务器类加载器中,所以它们对所有web应用程序都是通用的,而log4j2使用类加载器来加载记录器上下文

现在,我希望每个应用程序都有单独的log4j2实现,这对于其他web应用程序来说是不常见的

请注意,我无法复制每个WEB应用程序的WEB-INF/lib中的log4j2库,因为我们已经有了war的大小限制

请建议如何在单个weblogic容器中为每个web应用程序实现单独的log4j2配置

我尝试使用JNDIContextSelector,但它在Weblogic中不起作用,或者我不知道如何使它在Weblogic中起作用,因为在完成log4j2网站中提到的所有必需更改后,它无法找到记录器


请帮助我,因为我陷入了上周的同一个问题。

不幸的是,到目前为止,我所知道的最简单的解决方案是在每个WEB应用程序的WEB-INF/lib中包含log4j2库

如果log4j2jar文件位于共享库目录中,则它们由共享类加载器加载,并且配置在所有web应用程序之间共享。这就是web容器和log4j2的设计方式

我会关注你提到的这个尺寸限制。为什么war文件有大小限制?也许有另一种方法可以绕过这个尺寸限制?购买额外的硬盘或更大的服务器会解决这个问题吗?(硬件比您和您的开发团队在这方面花费的时间要便宜得多…)

如果您真的很绝望,您可以尝试使用一种配置,使用不同名称的记录器记录到不同的文件或在不同级别进行过滤。当应用程序调用LogManager.getLogger时,传递的字符串将成为记录器的名称。此字符串可在配置中用于控制筛选和目标追加器。在应用程序中可以做的一件事是为loggers应用程序指定以下唯一名称:

// App.getPrefix() returns "app1." or "app2." etc: a unique name for each web app
Logger logger = LogManager.getLogger(App.getPrefix() + getClass().getName());
然后在配置中使用不同的记录器和附加器:

<Configuration status="debug">
  <Appenders>
     <File name="app1File" ... 
     <File name="app2File" ... 
  </Appenders>
  <Loggers>
    <Logger name="app1" level="TRACE">
      <AppenderRef ref="app1File"/>
    </Logger>
    <Logger name="app2" level="TRACE">
      <AppenderRef ref="app2File"/>
    </Logger>
  </Loggers>
</Configuration>