Нужна помощь - журналы смешиваются между двумя разными приложениями, работающими в одной JVM - PullRequest
0 голосов
/ 23 октября 2010

У меня проблемы с ведением журнала 2 приложений, развернутых в той же JVM.

У меня есть 2 приложения, скажем, A & B, работающие на сервере приложений Websphere.

A - это проект EJB, имеющий log4j.jar в EJB jar

B также является проектом EJB, но в нем отсутствует log4j.jar как часть EJB-jar, и он ссылается на jar-файл log4j, доступный в Websphere lib.

A & B имеют независимые классы Logger, например ALogger.java и BLogger.java, соответственно.

ALogger.java имеющий static Logger logger = Logger.getLogger ("A.class)");

BLogger.java, имеющий static 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

log4j работает нормально, когда B вызывается после обработки A.

Проблема: Во время работы A, если запускается B, журналы приложения A записываются в файл журнала приложения B. Как мне исправить эту проблему?

Я пытался изменить имена приложений для приложения B, но это не сработало.

Ответы [ 3 ]

1 голос
/ 24 октября 2010

Log4J считывает свою конфигурацию ровно один раз (если программно не указано иное) в рамках одного загрузчика классов.

Ваша стратегия создания пакетов сделала загрузку Log4J в WebSphere первой, в загрузчике классов WebSphere, который выше в иерархии загрузчиков классов.Log4J инициализирует и загружает;позже, когда ваше приложение (в которое встроен log4j) выполняет вызов регистрации, Log4J обнаруживает, что оно уже инициализировано, поэтому оно даже не читает второй файл свойств.

Правило большого пальца, котороеЧтобы избежать подобных случаев, необходимо соблюдать следующее: если вы используете утилиту JAR, которая считывает конфигурацию и сохраняет ее статически на уровне загрузчика классов (например: Log4J; Apache FOP; и многие другие), то вы должны связать этот JAR с вашимapplication и not чтобы ваш код ссылался на копии, предоставленные AppServer.

Следуйте этому правилу, и вы получите золотую награду ... Даже в WebSphere, которая, как известно, давно известназа то, что он привел в замешательство стратегии загрузки классов.

0 голосов
/ 18 апреля 2014

Поскольку log4j инициализируется с использованием статического класса, поэтому не следует использовать расположение общей библиотеки, например glassfish / lib.Попробуйте собрать библиотеку log4j в вашем приложении.

0 голосов
/ 23 октября 2010

B также является проектом EJB, но в нем отсутствует log4j.jar как часть EJB-jar, и он ссылается на jar-файл log4j, доступный в Websphere lib

Попробуйте изменить это.Сделайте, чтобы оба проекта связали их собственный log4j.На данный момент, log4j, вероятно, запутался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...