Ведение журнала в Tomcat#

JULI привязан к использованию фреймворка java.util.logging, поэтому внутреннее ведение журнала Tomcat и ведение журнала веб-приложений независимы, даже если веб-приложение использует Apache Commons Logging.

Чтобы настроить Tomcat для использования альтернативного фреймворка внутреннего ведения журнала, следуйте инструкциям, предоставленным данным фреймворком для перенаправления ведения журнала для приложений, использующих java.util.logging. Учтите, что альтернативный фреймворк должен поддерживать работу в среде, где могут существовать разные log-файлы с одинаковыми именами в разных загрузчиках классов.

Ведение журнала в веб-приложениях#

Веб-приложение, работающее на Tomcat, может:

  1. Использовать любой фреймворк ведения журнала.

  2. Использовать системный API ведения журнала java.util.logging.

  3. Использовать API ведения журнала, предоставляемое спецификацией Java Servlets: javax.servlet.ServletContext.log(...).

Фреймворки, используемые разными веб-приложениями, независимы. Исключением является java.util.logging. Если он используется напрямую или косвенно библиотекой ведения журнала, то его элементы будут общими для всех веб-приложений, так как он загружается системным загрузчиком классов.

Java Logging API — java.util.logging#

Tomcat имеет собственную реализацию нескольких ключевых элементов API java.util.logging. Данная реализация называется JULI. Ключевым компонентом является пользовательская реализация LogManager, которая учитывает разные веб-приложения, работающие на Tomcat (и их разные загрузчики классов). Она поддерживает приватные конфигурации ведения журнала для каждого приложения. Также Tomcat получает уведомления, когда веб-приложение выгружается из памяти, чтобы ссылки на его классы могли быть очищены для предотвращения утечек памяти.

java.util.logging активируется путем установки определенных системных свойств при запуске Java. Скрипты запуска Tomcat делают это автоматически, но если используются другие инструменты для запуска Tomcat (например, jsvc или запуск из IDE), то данные настройки следует выполнить пользователю.

Ведение журнала API Servlets#

Вызовы javax.servlet.ServletContext.log(...) для записи log-файлов обрабатываются внутренним журналом Tomcat. Такие сообщения записываются в категорию с именем: org.apache.catalina.core.ContainerBase.[${engine}].[${host}].[${context}]. Данный способ ведения журнала выполняется в соответствии с конфигурацией Tomcat. Переопределить его в веб-приложении невозможно.

Ведение журнала API Servlets обладаем меньшей функциональностью, чем API java.util.logging. Например, невозможно управлять уровнями ведения журнала. Однако в реализации Tomcat вызовы ServletContext.log(String) или GenericServlet.log(String) записываются на уровне INFO. Вызовы ServletContext.log(String, Throwable) или GenericServlet.log(String, Throwable) записываются на уровне SEVERE.

Консоль#

При запуске Tomcat вывод консоли обычно перенаправляется в файл с именем catalina.out. Имя файла можно настроить с помощью переменной окружения. В файл попадает все, что записывается в System.err/out, включая:

  • непойманные исключения, выводимые методом java.lang.ThreadGroup.uncaughtException(..);

  • дампы потоков, если они запрошены через системный сигнал.

Использование java.util.logging (по умолчанию)#

Реализация java.util.logging, предоставляемая по умолчанию в JDK, ограничена для практического использования. Основное ограничение — невозможность настроить ведение журнала для каждого веб-приложения, так как конфигурация применяется на уровне всей JVM. Tomcat по умолчанию заменяет стандартную реализацию LogManager на реализацию, называемую JULI, которая устраняет эти недостатки.

JULI поддерживает те же механизмы конфигурации, что и стандартный java.util.logging, используя либо программный подход, либо файлы свойств. Основное отличие заключается в том, что можно задавать файлы свойств для каждого загрузчика классов. Также поддерживаются расширенные конструкции. JULI включен по умолчанию и поддерживает конфигурацию для каждого загрузчика классов в дополнение к глобальной конфигурации java.util.logging.

Ведение журнала можно настроить на следующих уровнях:

  • Глобально. Настраивается в файле ${catalina.base}/conf/logging.properties. Данный файл указывается системным свойством java.util.logging.config.file, которое задается скриптами запуска. Если файл недоступен или не настроен, по умолчанию используется файл ${java.home}/lib/logging.properties в JRE.

  • В веб-приложении. Файл должен находиться в WEB-INF/classes/logging.properties.

Расширения JULI#

Конфигурация, используемая JULI, совместима с java.util.logging и включает несколько расширений для большей гибкости:

  • Префиксы для обработчиков. Имена обработчиков могут содержать префиксы, что позволяет создавать несколько экземпляров обработчиков одного класса. Префикс — это строка, начинающаяся с цифры и заканчивающаяся точкой, например, 22foobar..

  • Подстановка системных свойств. Значения свойств могут содержать выражения вида ${systemPropertyName}.

  • Подстановка свойств веб-приложения. Если загрузчик классов реализует интерфейс org.apache.juli.WebappProperties, то поддерживается подстановка ${classloader.webappName}, ${classloader.hostName} и ${classloader.serviceName}.

  • Делегирование родительским обработчикам. По умолчанию логгеры не делегируют свои сообщения родительским обработчикам. Это можно изменить с помощью свойства loggerName.useParentHandlers.

  • Корневой логгер. Корневой логгер может определять свои обработчики с помощью свойства .handlers.

  • Срок хранения log-файлов. По умолчанию файлы хранятся 90 дней. Это можно изменить с помощью свойства handlerName.maxDays.

  • Дополнительные классы. JULI предоставляет дополнительные классы, такие как org.apache.juli.FileHandler и org.apache.juli.AsyncFileHandler.