Простое руководство по ведению журналов Tomcat

В производственной среде Tomcat эффективное использование протоколирования является важной частью администрирования вашего сайта и отслеживания производительности вашего сервера Tomcat.

Вероятно, вы уже внедрили ведение журналов в свои веб-приложения и, возможно, не понимаете, зачем вам нужно беспокоиться о настройке журналов для внутренних компонентов Tomcat. Это вполне понятно — стандартная конфигурация протоколирования Tomcat вполне устраивает большинство пользователей. Однако, потратив некоторое время на ознакомление с опциями протоколирования, доступными в Tomcat, вы можете сэкономить драгоценное время, если столкнетесь с неожиданной проблемой.

Ниже приведен обзор наиболее распространенных механизмов, конфигураций и проблем с логированием в Tomcat, чтобы помочь вам начать добавлять функциональную систему логирования в свой административный инструментарий уже сегодня.

Обзор протоколирования Tomcat

Начиная с Tomcat 5.5, в Tomcat используется технология Java Commons Logging (JCL) от Apache. JCL — это легкий API для Java-приложений, который позволяет поддерживать иерархическое протоколирование на всех уровнях, независимо от реализации протоколирования. Это означает, что вместо того, чтобы ограничиваться определенным жестко закодированным фреймворком, вы можете выбрать решение, которое подходит именно вам, с небольшим количеством дополнительных настроек.

В этой статье мы рассмотрим две наиболее распространенные реализации протоколирования, используемые в Tomcat — включенную реализацию JULI и Log4J, популярную, многофункциональную реализацию, совместимую с JCL.

Познакомьтесь с JULI — реализацией журналирования в Java-утилите

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

Наиболее заметной из расширенных функций JULI является возможность устанавливать файлы свойств на основе каждого загрузчика. Эта возможность делает переразвертывание веб-приложений значительно менее трудоемким.

Настройка JULI

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

  • logging.properties, расположенный в каталоге $JAVA_HOME/jre/lib вашего JDK, или в пользовательском месте, определенном путем редактирования свойства java.util.logging.config.file
  • java.util.logging.config.class, который используется для программной конфигурации
  • файл logging.properties, расположенный внутри каждого загрузчика классов, который вы хотите сконфигурировать.

Это позволяет вам создавать отдельные конфигурации для каждого из ваших веб-приложений с жизненным циклом, эквивалентным данному приложению, в дополнение к основной конфигурации протоколирования Tomcat.

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

  • Чтобы можно было определить несколько обработчиков одного класса, поддерживаются префиксы обработчиков, состоящие из строк, начинающихся с цифры и заканчивающихся символом «.» (например, «1example.»).
  • Список обработчиков регистратора может быть определен с помощью свойства loggerName.handlers — функциональность, которую вы можете узнать в Java 6.x.
  • Булево значение loggerName.useParentHandlers определяет, делегируют ли регистраторы родительские функции с соответствующими обработчиками. По умолчанию эта функция отключена.
  • Свойство .handlers можно использовать для определения набора обработчиков корневых регистраторов.
  • Буферизация логгеров может быть настроена для каждого обработчика с помощью свойства bufferSize. Значения больше 0 заставят обработчик использовать BufferedOutputStream равной величины в дополнение к буферизации по умолчанию системы, в то время как при установке значения 0 будет использоваться только значение по умолчанию системы.
  • Установка значения меньше нуля заставит буфер промываться при каждой записи в журнал, фактически отключая буферизацию.
  • Установка значения свойства в ${systemPropertyName} приведет к тому, что значение свойства будет заменено указанным системным свойством.

Простые примеры файла logging.properties для основной конфигурации Tomcat и конфигурации для каждого веб-приложения приведены на сайте документации Apache по Tomcat.

Использование Log4J в Tomcat

Log4J является самой популярной реализацией протоколирования для веб-приложений Java, и на то есть веские причины — он оптимизирован по скорости, иерархичен, отказоустойчив, потокобезопасен, обладает высокой конфигурацией и расширяемостью, а также специально разработан для уменьшения падения производительности, вызванного протоколами, без их удаления.

Другими словами, несмотря на то, что Tomcat настроен на использование JULI logging из коробки, если вы заинтересованы в создании более элегантной системы логирования для вашего сайта, вам следует рассмотреть возможность перехода на Log4J. Вот базовое руководство по установке и запуску Log4J на Tomcat.

Конфигурирование Log4J

Благодаря поддержке JCL в Tomcat, настройка Log4J в первый раз является довольно безболезненным процессом. Однако, прежде чем приступить к работе, вам придется загрузить полную версию JCL, входящую в комплект поставки Tomcat, которая жестко закодирована для использования с JULI.

Вы можете либо загрузить полную реализацию JCL из каталога «bin/extras» на странице загрузки Apache Tomcat, либо собрать ее из дерева исходников Tomcat, используя команду -f extras.xml, которая создаст «tomcat-juli.jar» и «tomcat-juli-adapters.jar» в каталоге «output/extras» Tomcat. Скопируйте эти файлы в «$CATALINA_HOME/bin/» (заменив существующий «tomcat-juli.jar»), и ваш Tomcat будет иметь полную поддержку JCL.

Теперь, когда Tomcat готов к работе с Log4J, скачайте логгер с сайта проекта и поместите «log4jx.y.z.jar» в «$CATALINA_HOME/lib».

Осталось сделать еще два шага. Поскольку вы больше не будете использовать logging.properties для конфигурации, вам придется создать log4j.properties в «$CATALINA_HOME/lib». Со временем вы захотите изменить этот файл, чтобы воспользоваться многочисленными возможностями Log4J, но пока вы можете просто использовать базовую конфигурацию, рекомендованную Apache. Это создаст «tomcat.log» в вашей основной папке журналов Tomcat, с максимальным размером 10 МБ и максимальным количеством 10 резервных копий:

log4j.rootLogger=INFO, R 


log4j.appender.R=org.apache.log4j.RollingFileAppender


log4j.appender.R.File=${catalina.base}/logs/tomcat.log


log4j.appender.R.MaxFileSize=10MB


log4j.appender.R.MaxBackupIndex=10 


log4j.appender.R.layout=org.apache.log4j.PatternLayout


log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

Вот и все! Перезапустите Tomcat, и ваша новая система Log4J будет готова к работе.
Именование с учетом специфики контейнера

Вы можете подробно изучить новые возможности Log4J на сайте проекта, но вот одна очень полезная функция, которой не стоит пренебрегать: ведение журнала с учетом специфики пакета. Log4J использует имена Engine и Host, заключенные в квадратные скобки, чтобы обеспечить очень специфические уровни протоколирования для различных компонентов. Вот пример этого синтаксиса в действии, приведенный в документации Apache Tomcat:

  log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO


  log4j.logger.org.apache.catalina.core=WARN


  log4j.logger.org.apache.catalina.session=ERROR

Вот пример использования Log4J для регистрации сервлетов JSP, запущенных на определенном сервере Tomcat, при минимальном пороге:

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/].[jsp] = ALL

Вы также можете использовать этот синтаксис и схему конфигурации для каждого приложения, включив пользовательский файл «log4j.properties» в «WEB-INF/classes» и скопировав log4jx.y.z.jar в «WEB-INF/lib».

И последнее предупреждение: при настройке Log4J следует помнить, что настройки с низким порогом, такие как DEBUG или ALL, чрезвычайно многословны и заметно замедляют время запуска Tomcat.