вторник, октября 15, 2013

Проблема логирования в Oracle Weblogic Server 11g (10.3.6)

Казалось бы просто, естественное и законное желание залогировать исключение или вообще что-либо превратилось в целую проблему.


Как правило для логирования я использую пакет java.util.logging, входяший в JDK.
Итак есть объкет java.util.logging.Logger, который в блоке обработки исключения пишет сообщение с уровнем Level.INFO:

private static final String CLASS_NAME = MyClass.class.getName();
private static final Logger log = Logger.getLogger(CLASS_NAME);
...
try {
...
} catch (MyException e) {
    log.log(Level.INFO, "Exception: cannot get messages. ", e);
    ...
    }

В соответсвии с документацией от Oracle и использую следующую конфигурацию логгеров:

# Указываем хендлеры для корневого логгера
handlers = weblogic.logging.ServerLoggingHandler, java.util.logging.ConsoleHandler
# Определяем уровень корневого логгера
.level = INFO
# Устанавливаем уровни для хендлеров
java.util.logging.ConsoleHandler.level = INFO
weblogic.logging.ServerLoggingHandler.level = INFO

weblogic.logging.ServerLoggingHandler - это хэндлер для записи в AdminServer.log. В соответствии с этой конфигурацией в моем примере logger должен использовать уровень родительского логгера, коим является корневой логгер.

Запускаю WLS с параметром -Djava.util.logging.config.file=C:\mydomain\logging.properties
Умышленно в вызывающем коде выбрасываю исключение, но в и AdminServer.log и консоли пусто.

В консоли администрирования WSL выставил самые минимальные уровни для всего, что только можно, но безрезультатно, сообщения нигде не появляются. Тут на помощь пришел отладчик.











Теперь всё встало на свои места и с уровнем WARNING мои сообщения попали в лог-файл и консоль. Кто и зачем выставил корневому логгеру уровень WARNING я не знаю, но уверен, что это точно не мое приложение. Возможно это связано с конфигурацией домена (BPM) или с тем, что в моем приложении я использую версию jaxws 2.2.8. 

Выхода из ситуации я увидел два. 

Первый - это установка нужного уровня логирования для каждого логгера персонально в logging.properties или методом setLevel(Level):  

ru.otr.vtb24.channel.agent.MailAgent.level=INFO
# Можно сказать логгеру не использовать родительский хендлер
ru.otr.vtb24.channel.agent.MailAgent.useParentHandlers = false
# Дополнительно установить только необходимые хендлеры
ru.otr.vtb24.channel.agent.MailAgent.handlers = java.util.logging.ConsoleHandler, weblogic.logging.ServerLoggingHandler

Второй - это в блоке инициализации приложения установить необходимый уровень корневому логгеру, например:

Logger.getLogger("").setLevel(Level.INFO);

Ссылки:
http://docs.oracle.com/cd/E21764_01/web.1111/e13739/logging_services.htm - документация от Oracle по WLS
http://docs.oracle.com/javase/6/docs/technotes/guides/logging/overview.html - Java Logging overview
https://forums.oracle.com/thread/2241378 - аналогичная проблема у зарубежного коллеги



Комментариев нет:

Отправить комментарий