需要帮助 - 日志在同一 JVM 中运行的 2 个不同应用程序之间混合

发布于 2024-09-28 10:26:48 字数 2505 浏览 0 评论 0原文

我在记录部署在同一 JVM 中的 2 个应用程序时遇到问题。

我有 2 个申请,分别是 A 和 A。 B 运行在Websphere 应用程序服务器中。

A 是 EJB 项目,EJB jar 中包含 log4j.jar

B 也是 EJB 项目,但 EJB jar 中没有 log4j.jar,它引用 Websphere lib 中可用的 log4j jar。

A& B 有独立的 Logger 类,分别为 ALogger.java 和 BLogger.java。

ALogger.java有 static Logger logger = Logger.getLogger("A.class)");

BLogger.java 具有 静态 Logger logger = Logger.getLogger("B.class)");

两者的 log4j.properties 不同,日志写入 diff 文件

应用程序 A:

log4j.rootLogger=ALL,ErrorAppender,file

log4j.appender.ErrorAppender.Threshold=WARN
log4j.appender.ErrorAppender.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.ErrorAppender.DatePattern='.'yyyy-MM-dd
log4j.appender.ErrorAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ErrorAppender.File=**AErrorLog.log**
log4j.appender.ErrorAppender=org.apache.log4j.RollingFileAppender
log4j.appender.ErrorAppender.MaxFileSize=1MB
log4j.appender.ErrorAppender.MaxBackupIndex=5

log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.File=**ALog.log**
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=5

应用程序 B:

log4j.rootLogger=ALL,ErrorAppender,file

log4j.appender.ErrorAppender.Threshold=WARN
log4j.appender.ErrorAppender.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.ErrorAppender.DatePattern='.'yyyy-MM-dd
log4j.appender.ErrorAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ErrorAppender.File=**BErrorLog.log**
log4j.appender.ErrorAppender=org.apache.log4j.RollingFileAppender
log4j.appender.ErrorAppender.MaxFileSize=1MB
log4j.appender.ErrorAppender.MaxBackupIndex=5

log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.File=**BLog.log**
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=5

在处理 A 后调用 B 时,log4j 工作正常。

问题:当 A 正在运行时,如果 B 被触发,应用程序 A 日志正在写入应用程序 B 的日志文件。我该如何解决这个问题?

我尝试更改应用程序 B 的附加程序名称,但没有成功。

I am facing issues with logging of 2 applications deployed in same JVM.

I have 2 applications say A & B running in Websphere application server.

A is EJB project having log4j.jar in EJB jar

B is also EJB project but doesn't have log4j.jar as part of EJB jar and it refers to log4j jar available in Websphere lib.

A & B have independent Logger classes say ALogger.java and BLogger.java resp.

ALogger.java having
static Logger logger = Logger.getLogger("A.class)");

BLogger.java having
static Logger logger = Logger.getLogger("B.class)");

log4j.properties fot both are different and logs are written to diff file

App A:

log4j.rootLogger=ALL,ErrorAppender,file

log4j.appender.ErrorAppender.Threshold=WARN
log4j.appender.ErrorAppender.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.ErrorAppender.DatePattern='.'yyyy-MM-dd
log4j.appender.ErrorAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ErrorAppender.File=**AErrorLog.log**
log4j.appender.ErrorAppender=org.apache.log4j.RollingFileAppender
log4j.appender.ErrorAppender.MaxFileSize=1MB
log4j.appender.ErrorAppender.MaxBackupIndex=5

log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.File=**ALog.log**
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=5

App B:

log4j.rootLogger=ALL,ErrorAppender,file

log4j.appender.ErrorAppender.Threshold=WARN
log4j.appender.ErrorAppender.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.ErrorAppender.DatePattern='.'yyyy-MM-dd
log4j.appender.ErrorAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ErrorAppender.File=**BErrorLog.log**
log4j.appender.ErrorAppender=org.apache.log4j.RollingFileAppender
log4j.appender.ErrorAppender.MaxFileSize=1MB
log4j.appender.ErrorAppender.MaxBackupIndex=5

log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout.ConversionPattern=%-5p\t%d{ddMMyyyy-HH\:mm\:ss}\t%m%n
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.File=**BLog.log**
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=5

log4j works fine when B is invoked after processing of A.

Problem : While A is running if B gets triggered,App A logs are getting written to App B's log file. How do I fix this issue?

I have tried changing appender names for App B but it didn't work.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

南笙 2024-10-05 10:26:48

Log4J 在一个类加载器的范围内只读取一次其配置(除非以编程方式指示这样做)。

您的打包策略使WebSphere 的Log4J 在WebSphere 的类加载器中首先加载,该类加载器在类加载器层次结构中处于较高位置。 Log4J初始化并加载;稍后,当您的应用程序(其中嵌入了 log4j)进行日志记录调用时,Log4J 发现它已经初始化,因此它甚至不会读取第二个属性文件。

为避免类似情况必须遵循的经验法则是:如果您使用的实用程序 JAR 读取配置并将其静态存储在类加载器级别(例如:Log4J、Apache FOP 和许多其他),那么您必须将该 JAR 与您的应用程序捆绑在一起,并且让您的代码引用 AppServer 提供的副本。

遵循这条规则,您就会获得成功……即使在 WebSphere 下,多年来,WebSphere 因其类加载策略造成一些混乱而臭名昭著。

Log4J reads its configuration exactly once (unless instructed programmatically to do otherwise) within the scope of one classloader.

Your packaging strategy made WebSphere's Log4J load first, within WebSphere's classloader which is higher in the classloader hierarchy. Log4J initializes and loads; later, when your application (which has log4j embedded in it) makes a logging call, Log4J finds out that it is already initialized, so it doesn't even read the second property file.

The rule of thumb that must be followed to avoid similar cases is this: If you are using a utility JAR that reads configuration and stores it statically at the classloader level (for example: Log4J; Apache FOP; and many others), then you must bundle that JAR with your application and not have your code refer to AppServer-provided copies.

Follow that rule and you'll be golden... Even under WebSphere, which, for years, has been notoriously known for causing some mess with its classloading strategies.

如若梦似彩虹 2024-10-05 10:26:48

B 也是 EJB 项目,但 EJB jar 中没有 log4j.jar,它引用 Websphere lib 中可用的 log4j jar

尝试更改它。让两个项目都捆绑自己的 log4j。到目前为止,log4j 可能会感到困惑。

B is also EJB project but doesn't have log4j.jar as part of EJB jar and it refers to log4j jar available in Websphere lib

Try to change that. Have both projects bundle their own log4j. As of now, log4j is probably getting confused.

坚持沉默 2024-10-05 10:26:48

由于 log4j 是使用静态类初始化的,因此不应使用共享库位置,例如 glassfish/lib。尝试在您的应用程序中捆绑 log4j 库。

Because of log4j is initialed by using static class, so you should not use share library location such as glassfish/lib. Try to bundle log4j library at your application.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文