当前位置: 首页 > 知识库问答 >
问题:

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

司马祖鹤
2023-03-14

我们有以下设置:

应用服务器:Weblogic 10.3.6

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

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

我们为每个web应用程序制作了单独的log4j2配置文件,使用log4j2-web.jar初始化web.xml但是我们观察到当我们加载第一个web应用程序时,log4j2配置文件被加载,但是当我们尝试加载第二个和第二个第三个web应用程序,有他们单独的log4j配置xmls,它不加载新的配置文件,而是设置第一个首先部署的web应用程序的log4j2配置。

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

现在,我希望每个应用程序都有其单独的log4j2实现,这对于其他webapplication.so日志记录将是不同的每个应用程序。

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

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

我试图使用JNDIContextSelector,但它不能在Weblogic工作,或者我不知道如何使它在weblogic中工作,因为在做了log4j2网站中提到的所有必需的更改后,它无法找到记录器。

请帮助我,因为我被困在同一个问题从上周。

共有1个答案

潘宸
2023-03-14

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

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

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

如果您真的很绝望,您可以尝试使用一种配置,使用不同名称的记录器记录到不同的文件或在不同级别进行过滤。当应用程序调用LogManager时。getLogger,传递的html" target="_blank">字符串将成为记录器的名称。此字符串可在配置中用于控制筛选和目标追加器。在应用程序中可以做的一件事是为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>

这显然有点像黑客,对于开发团队无法控制的类不起作用。。。

您还可以在log4j-user邮件列表中询问是否有其他log4j2团队成员有任何想法。

 类似资料:
  • 我们将多个spring mvc应用程序(war)部署到WebLogic12c。每个was都依赖于一个或两个与其打包的应用程序库(jar)。我们想要做的是,创建应用程序(war)特定的日志文件,并将其配置为根据一定的大小旋转,并将其旧日志文件归档到某个文件夹。 如何在log4j2中实现?

  • 根据log4j和log4j2留档,使用tld和jsp页面可以很好地工作。 http://logging.apache.org/log4j/2.x/manual/webapp.html http://logging.apache.org/log4j/2.x/log4j-taglib/tagreference.html#log.tld 它可以与xmlns一起使用:log=”http://logging

  • 问题内容: 与在内置的Web服务器上运行独立的Java应用程序并在反向代理后面运行相比,构建一个小型的Java Web应用程序以在Servlet容器(如Tomcat)中运行的优势是什么? 我已经使用Java大约一年了。我注意到启动Tomcat需要时间,并且由于类加载器问题,并非总是可以进行热重新部署。Servlet API在我看来有些令人费解,尤其是从配置和RESTful设计的角度来看(实际上并没

  • 我将Web服务部署为Tomcat 8.0.24上的Web应用程序(war)。应用程序罐已经过测试,它们工作正常。现在,为了配置和测试log4j,我引发了一个运行时错误(没有连接db)。 我试图只为应用程序日志设置log4j2(而不是tomcat),并使用Netbeans 8.0.2构建war。 我在类路径中包含了以下罐子: 和log4j2。WEB-INF中的xml,只有根记录器配置为捕获来自WEB

  • 我想在IOS和Android上实现电子商务应用程序。我可以把应用程序分为两个部分,不太安全,更安全。我可以说更安全的是在应用程序中接受付款。因此,出于这个目的,我希望有独立的登录系统来进入应用程序和支付。我使用Firebase身份验证和密码身份验证。所以在项目开始时,如果我们想使用Firebase(用于身份验证和数据库),我们需要为Android应用程序添加google-services.json

  • 我试图通过以下教程在我的Web应用程序中配置log4j2。我正在使用glassfish 4.1。1服务器和servlet版本3.1。我可以使用以下配置配置日志功能: log4j。性质 属性文件放在src/main/资源文件夹中 网状物xml 定义文件位置的上下文参数被注释掉。默认情况下,log4j可能会查找名为log4j的文件。财产。不过,我只是想知道指定文件位置的方法是否正确。 我也不确定哪个j