java - LOG4J 作为单例,在服务器停止和启动时关闭附加程序(尝试附加到关闭的附加程序)

标签 java servlets jakarta-ee log4j websphere

我们有一个 j2ee 网络环境。服务器配置为跨多个 webapps 共享 session 和可能的类加载器。基本上,一个类加载器可以为多个网络应用程序提供服务。

这似乎会导致 log4j 出现问题。不同的 webapps 可能有不同的 log4j 配置,但日志记录可能会在一个文件中停止。

我们收到以下错误:

log4j:ERROR Attempted to append to closed appender named [mylogger]

服务器:websphere6+ Log4j:1.4.2 Java:1.5

Example log4j.properties (webapp1):

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=/usr/local/file1.log
log4j.additivity.com.app=false

Example log4j.properties (webapp2):

log4j.appender.Z=org.apache.log4j.RollingFileAppender
log4j.appender.Z.File=/usr/local/file2.log
log4j.additivity.com.app=false

现在,来自 webapp2 的日志记录可能会出现在 webapp1 日志中,反之亦然。我们不希望这样。

最佳答案

Log4j 可能只初始化一次并随机加载一个或另一个 log4j.properties。

在我们的案例中,我们决定让每个 WebApp 都有一个单独的类加载器。这样,我们可以决定为每个 WebApp 更改其他框架(如 Spring 或 iBatis)上的日志级别。

调试类加载器(在 WebSphere 中很常见)的最佳方法是找出您正在使用哪个 Log4j jar 以及使用了哪个 log4.properties。

URL url = Logger.class.getProtectionDomain().getCodeSource().getLocation();
System.out.println("Sourcing Log4j from " + url

关于java - LOG4J 作为单例,在服务器停止和启动时关闭附加程序(尝试附加到关闭的附加程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4214734/

相关文章:

java - 从 Mule 中的虚拟机队列发布到 REST 端点

jsf - Bean 未实例化

java - 通过tag停止WorkManager并检查是否运行有问题

java.lang.ClassCastException : cannot be cast to javax. servlet.Servlet

java - 如何在 java servlet 中以分块响应发送 Http 预告片/页脚?

java - 如何使用Servlet和Ajax?

java - 数据表文本按条件着色?

java - JTextPane 不显示在动态添加的 JFrame 内

java - 运行 Cucumber 并生成 html 报告,无需 maven/gradle 插件

java - 安卓打开失败: EACCES (Permission denied) when try to read a file in data/data