Логирование с JUL (java . util . Logging)

Этот фреймворк логирования тоже не стоит использовать в реальных проектах (как и System.err), даже не смотря на его присутствие в стандартной поставке Java, но знать о нём полезно. В современных проектах принято использовать Slf4j и Logback.

JUL появился в Java 1.4. Этот пример я пишу в Java 8. Работа с JUL происходит через класс java.util.logging.Logger. Мы получаем экземпляр этого класса через фабричный метод getLogger:

Для записи сообщений в лог мы будем использовать методы нашего полученного экземпляра. Самый главный метод:

Все остальные методы логирования (а их много) вызывают этот метод. Напрямую его мы использовать не будем, так как вызывать другие методы гораздо проще. Например:

Тут уже проще. Мы указываем сообщение и уровень логирования. Уровней логирования у нас всего семь:

  1. SEVERE (ошибка)
  2. WARNING (предупреждение)
  3. INFO (информационное сообщение)
  4. CONFIG
  5. FINE (сообщение об успешной операции)
  6. FINER
  7. FINEST

Сообщение же может быть любым текстом. Пример записи сообщения в лог с уровнем INFO:

Также для каждого из уровней логирования есть огромное множество перегруженных методов с различным числом параметров. Например, тот же самый результат можно получить вызвав:

Мы также можем писать сообщения об ошибках с уровнем логирования SEVERE, предупреждениях WARNING и т. д.:

В результате выполнения в консоли мы увидим:

Если мы хотим передать исключение в лог, то нужно использовать специальный метод, принимающий Throwable:

В результате выполнения этого кода в консоли будет:

Каждое сообщение, отправленное в логгер проходит фильтры, которые определяют, должно ли оно попасть в результирующий лог, например, по LogLevel, затем через обработчики. Обработчики (Handlers) направляют результат лога в файл, консоль или куда-нибудь по сети. В самой Java уже есть пять таких обработчиков, но можно добавлять свои. Стандартные обработчики:

  • StreamHandler пишет в OutputStream.
  • ConsoleHandler пишет в System.err.
  • FileHandler пишет в файл.
  • SocketHandler отправляет по сети на указанный порт.
  • MemoryHandler просто сохраняет в ОЗУ.

Форматировщики используются для записи логов в определённом формате, например в XML или HTML.

Как всё это настраивается? Настраивать можно либо программно, тогда нужно указать -Djava.util.logging.config.class=<имя конфигурационного класса> при старте Java, либо с помощью файла, указываемого в -Djava.util.logging.config.file=<путь к конфигурационному файлу>. Если ничего из этого в аргументах JVM не указано, то используется конфигурация по умолчанию.

Файл с настройками, указываемый в java.util.logging.config.file — это обычный Java Properties файл. Пример его содержимого:

В свойстве handlers мы указываем список обработчиков (handler-ов), которые нужно добавить к корневому логеру. Затем мы описываем FileHandler и ConsoleHandler.

В свойстве level мы указываем уровень логирования. В нашем случае сообщения с уровнем логирования от SEVERE до FINEST будут попадать в лог.

В свойстве formatter для FileHandler мы указали SimpleFormatter. Можно было указать XMLFormatter или написать какой-нибудь свой. Написание своего форматировщика я как-то расписывал на своём старом сайте (внешняя ссылка, много рекламы, не пугайтесь).

Свойство encoding позволяет задать кодировку для логов.

В limit для FileHandler указывается ограничение на размер файла логов для ротации в байтах.

Свойство pattern позволяет указать путь к файлу лога для FileHandler, где %u будет заменяться на числа (0, 1 …), для разрешения конфликтов имени файла.

Вот и всё. На всякий случай приложу полные коды класса JulExample:

А полные коды “logging.properties” я уже указывал ранее. Не забывайте при запуске Java указывать параметр JVM-Djava.util.logging.config.file=<путь к файлу logging.properties>.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *