Библиотеки логирования: понятие, суть, функции
Для настройки логирования разработчики в своем большинстве пользуются готовыми программными решениями. Такие решения универсальны. С их помощью можно работать с любыми кодами и сохранять любой формат записи.
Прежде, чем переходить к библиотекам, рассмотрим основные инструменты логирования языка Java — Logger, Appender, Layout.
Logger — это инструмент, отвечающий за запись информации о работе системы в лог-файл. Logger предоставляет различные уровни логирования, которые можно использовать для классификации сообщений – например, TRACE, DEBUG, INFO, WARN и ERROR. Каждый из них имеет свою степень приоритетности и позволяет настраивать запись логов в зависимости от уровня важности сообщения. Правильно и четко сформированные журналы логов значительно упрощают расследование разных инцидентов, происходящих в процессе функционирования интернет-ресурсов.
Appender второй по значимости инструмент. Используется не менее часто, чем Логгер. Он отвечает за то, куда и каким образом будут выводиться записи и где они будут храниться. Appender определяет тип выходных данных, форматирование сообщений и фильтрацию записей. Благодаря Appender можно настроить Logger таким образом, чтобы сохранялись только самые важные сообщения в конкретном месте и в заданном формате.
Существует большое количество типов Appender. Все они отличаются целями использования. Например, в языке Java существует FileAppender, который пишет сообщения в отдельный файл, ConsoleAppender, который выводит логи на консоль, а также SocketAppender, который направляет логи на отдельный удаленный сервер.
Кроме того, с помощью нескольких Appender можно настроить один Logger таким образом, чтобы журналы логов сохранялись в нескольких местах одновременно.
Layout еще один важный инструмент логирования. Он отвечает за то, каким образом информация будет записываться в лог-файл. Этот инструмент задает формат выведения сообщения: какие поля будут включены в файл, как они будут форматироваться, в каком порядке будут выводиться и т.д.
Разные типы Layout могут быть использованы для различных целей. Например, SimpleLayout просто выводит текст сообщения, а PatternLayout позволяет настраивать формат записи сообщений с помощью строки формата.
Инструментарий логгинга основан на готовых решениях — библиотеках. Рассмотрим их подробнее.
Обзор бибилиотек логгеров log4j, JUL, SLF4J, Logback
Библиотеки логгеров предоставляют собой набор функций и методов для создания логов. Наиболее популярными библиотеками являются:
- log4j. Быстро, надежно ведет журналы. Написана на Java и распространяется по лицензии apache. log4j портировали на разные языки: С, С++, python и т.д. Благодаря внешним файлам легко настраивается. Журнал ведется исходя из уровня приоритета. Он может предложить разные механизмы, которые направляют информацию регистрации на разные точки (файлы, консоли, системные журналы и т.д.).
- JUL. Самый главный плюс данного решения, это то, что он включен в JDK. В качестве основы здесь взят log4j. Благодаря решению IBM ‒ JUL активно развивается. Из недостатков можно выделить то, что JUL немного ухудшает понимание уровней, т.к. они отличаются от Logback и Log4j.
- SLF4J.Так называемая обертка над оберткой, которая работает на log4j, JUL, common-loggins. Инструмент делится на две части: API для приложения и реализация под каждый из видов логирования. Поддерживаются функции форматирования.
- Logback. Инструмент написан тем же разработчиком log4j. Это его преемник. Здесь хорошая производительность, есть нативная поддержка, фильтрация. Logback не требует настроек для того, чтобы начать записывать.
Что такое библиотека логирования. Обзор Log4Net, SeriLog, NLog
Библиотека логирования – более объемное понятие. Оно включает в себя программные решения, обеспечивающие функциональность не только процесса фиксации, но и управления логами.
Библиотеки позволяют формировать различные уровни логирования, фильтрацию и сортировку сообщений, поддержку различных форматов записи (текстовые файлы, базы данных, консоль и т.д.), а также другие функции, которые могут быть полезны для анализа работы приложения или системы, а также ее отладки.
Есть несколько достаточно популярных инструментов.
Log4Net реализовывает поименное логирование и выполняет массу других функций. Можно создать свою копию логгера, используя класс или ключ. Чтобы установить требуется создание конфигурационного файла. В сам файл разрешено добавлять фильтрацию. В конфигурацию для этого добавляются отдельные блоки.
SeriLog не может настраиваться с помощью изменения конфигурации файлов. Присутствует статическое свойство, в котором умещается объект. Во время записи возможно добавление операторов, которые при необходимости выведут все значения объектов.
NLog создает объекты логов с помощью кодов, файлов. Формат, который позволяет выводить сообщение можно установить, добавив в target элемент layout. Есть операторы, форматирующие строки, а также асинхронная обертка.
Это далеко не полный перечень популярных библиотек. В целом, все возможности библиотек схожи. При выборе нужной библиотеки логирования важно понимание, какие задачи Вы преследуете, настраивая логирование для своего ресурса.
Логирование Java: терминология, уровни логирования, log-файлы
Логирование Java — это процесс , при котором программа на Java-языке записывает сведения о своем исполнении в некий файл или базу данных. Логирование дает возможность отслеживать ход исполнения программы и конкретно кода.
Иногда с вашим программным продуктом происходит что-то непонятное , и он начинает себя вести не так , как задумано. Первое , что приходит на ум в этом случае , — в программе есть наличие ошибок. Самый п р остой способ это проверить — использовать логи программы, так как это возможность посмотреть, что происходит «внутри» самой программы.
Логирование Java напоминает процесс работы «черного ящика» в самолете — в случае возникновения критических ситуаций оно способно «рассказать», что не так работает и на что обратить внимание.
Термин «лог» — что это такое?
Логирование — это процесс, который неразрывно связан с термином «лог». Лог с английского можно перевести как «бортовой журнал».
В программировании лог — это специальный файл, который выполняет функцию «бортового журнала» программы. Именно в этот файл, а точнее , в лог программа производит записи о своей работе. Лог-файлы программа может создавать самостоятельно, чтобы вносить туда текстовые пометки.
Лог-файлы помогают «следить» за действиями программы, например, что она функционирует в конкретный момент времени или как она реагирует на действия пользователя.
У одного программного продукта лог-файлы могут быть разные. Например , может быть лог — файл типа:
- «access_log», в котором фиксируются действия программы при ее взаимодействии с пользователями;
- «error_log», в котором фиксируются все ошибки, произош едшие в результате работы программы;
- и др.
В одном лог-файле может быть множество записей, где каждая строчка будет содержать отдельные результаты для каждого взаимодействия с программой. То есть в каждой записи будет информация о том , что происходило с программным продуктом в конкретный момент времени.
Отметим различия между «логированием» и «логом»:
- логирование — это процесс, при котором программа прописывает какие-то записи в лог-файлы;
- лог — это сам файл или то место , куда программа производит необходимые записи.
Уровни логирования
Мы выяснили, что такое логи и что такое логирование Java. Не трудно догадаться, что если в лог-фай л записывать все действия программы, то там будет большое количество различных сведений. В некоторых ситуациях лог-файлы могут генерироваться очень быстро и в огромных размерах. В этом случае найти нужную информацию в логах будет очень не легко. Поэтому, чтобы контролировать объемы записываемой информации, придумали различные уровни логирования.
Уровни логирования применяются в программах на различных языках программирования, в том числе и на Java. Различают несколько основных уровней:
- debug — выводится информация, которая пригодится для отладки программы;
- info — обычные и стандартные сообщения;
- warning — нефатальное предупреждение;
- error — записи ошибок;
- fatal — фатальная ошибка;
- off — сообщения не выводятся;
- trace — информация для точной отладки;
- all — выводится вся информация.
«Поддержать» уровни логирования в Java можно двумя способами:
- Внутри программы можно расставить вызов нужной библиотеки в соответствии с заданным уровнем. Например, если произойдет ошибка, она будет логироваться как «error» и т. д.
- В момент запуска программы нужно указать уровень логирования для конкретной ситуации. Если ничего не указывать, то для программы будет применяться уровень «info», где буд у т записываться все ключевые и важные события, происходящие с программой, в том числе «warning» и «error». Если указать «error», будут записываться только ошибки.
Логирование Java: термины
Библиотеки логирования Java включают в себя 3 основных термина:
- Logger — это некий объект, который отвечает за запись информации в лог-файлы, опираясь на заданные уровни логирования. Основная задача логгера — не пропустить событие, которое нужно записать в лог-файл.
- Appender — это конечная точка, куда «приходит» информация для логирования. В качестве appender мо гут выступать: файл, база данных, консоль, сокет и др. У appender нет каких-либо ограничений, куда записывать сообщения. Все ограничивается только вашими способностями. Если Logger — это начальная точка в логировании, то Appender — это конечная точка. При этом один «логгер» может содержать несколько «аппендеров» и наоборот.
- Layout — это формат, в котором выводятся сообщения. Форматирование сообщений напрямую зависит от используемой библиотеки при логировании.
Библиотеки логирования Java
Библиотеки логирования Java — это набор инструментов, который применяют при логировании программ. Различают несколько популярных инструментов логирования:
- Apache log4j. Это первый набор инструментов для логирования Java, который появился еще в 1999-м году. Внутри себя имеет различны е способы вывода логов, несколько форматов логирования и мн. др. Раньше данная библиотека активно применялась, но уже долгое время этот проект не развивается.
- JUL. Имеет множество уровней логирования, например , только для отладки у этого инструмента есть в арсенале 3 отладочных уровня вместо одного стандартного.
- SLF4J. Этот инструмент является оберткой над многими популярными логгерами, например: logback, log4j, jul и др., поэтому его рекомендуется использовать в паре с полноценной библиотекой для логирования.
- Logback был создан как альтернатива умирающему log4j, поэтому он вобрал в себя все лучшее из этого инструмента, при этом усовершенствовал некоторые показатели.
Заключение
Дочитав статью, вы уже точно знаете , что такое логи, лог-файлы и логирование в Java. Также мы познакомились с основными терминами и инструментами в логиров а нии Java. Подробнее на каждом из них мы остановимся в следующих наших статьях, потому что проблему логирования Java нужно разбирать постепенно. А проблема есть, так как присутствует огромное количество разнообразного инструмента логирования, при этом нет четких стандартов самого логирования.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Введение в логирование Java
Логирование является мощным средством для понимания и отладки поведения программы во время выполнения. Логи собирают и сохраняют важные данные и делают их доступными для анализа в любой момент времени.
В этой статье обсуждаются самые популярные фреймворки логирования Java, Log4j 2 и Logback, а также их предшественник Log4j. Кроме того, кратко затрагивается SLF4J, который предоставляет общий интерфейс для различных фреймворков логирования.
Включение логирования
Все фреймворки логирования, обсуждаемые в статье, разделяют понятия loggers, appenders и layouts. Включение логирования внутри проекта выполняется в три общих шага:
- Добавление необходимых библиотек.
- Конфигурация.
- Размещение логов.
В следующих разделах обсуждаются шаги для каждой платформы в отдельности.
Log4j 2
Log4j 2 – это новая и улучшенная версия платформы ведения журналов Log4j. Наиболее убедительным улучшением является возможность асинхронного ведения журнала. Для Log4j 2 требуются следующие библиотеки:
org.apache.logging.log4j log4j-api 2.6.1 org.apache.logging.log4j log4j-core 2.6.1
Последнюю версию log4j-api можно найти здесь, а log4j-core – здесь.
Конфигурация
Настройка Log4j 2 основана на файле конфигурации log4j2.xml. Первое, что нужно настроить, это аппендеры (appenders). Они определяют, куда будет направляться сообщение журнала. Местом назначения может быть консоль, файл, сокет и т. д.
Log4j 2 имеет множество приложений для разных целей, найти дополнительную информацию можно на официальном сайте Log4j 2.
Посмотрим на простой пример конфигурации:
%p %m%n"/>
Можно установить name для каждого приложения, например, использовать console вместо stdout.
Обратите внимание на элемент PatternLayout – он определяет, как должно выглядеть сообщение. В нашем примере шаблон задается на основе параметра шаблона, где %d определяет шаблон даты, %p – вывод уровня логирования, %m – вывод сообщения лога, %n – добавляет символ новой строки. Более подробную информацию о шаблоне можете найти на официальной странице Log4j 2.
Наконец, чтобы включить appender (или несколько), нужно добавить его в раздел :
Запись логов в файл
Иногда требуется логирование в файл, поэтому добавим в конфигурацию логера fout:
%d %-5p %m%nw
File аппендера имеет несколько параметров, которые можно настроить:
- file – определяет имя лог-файла;
- append – значение по умолчанию для этого параметра равно true, что означает, что по умолчанию File аппендера будет добавляться к существующему файлу, а не обрезать его;
- PatternLayout, описанный в предыдущем примере.
Чтобы включить File аппендера, нужно добавить его в раздел :
Асинхронное логирование
Если хотите сделать свой Log4j 2 асинхронным, нужно добавить библиотеку LMAX disruptor в pom.xml. LMAX disruptor – это неблокирующая библиотека межпотокового взаимодействия.
Добавим disruptor в pom.xml:
com.lmax disruptor 3.3.4
Последнюю версию disruptor можно найти здесь. Если хотите использовать LMAX disruptor, нужно использовать вместо в конфигурации.
Или можно включить асинхронное логирование, задав для системного свойства Log4jContextSelector значение org.apache.logging.log4j.core.async.AsyncLoggerContextSelector.
Можно прочитать больше о настройке асинхронного логера Log4j2 и посмотреть некоторые диаграммы производительности на официальной странице Log4j2.
Применение
Ниже приведен простой пример, демонстрирующий использование Log4j для логирования:
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; public class Log4jExample < private static Logger logger = LogManager.getLogger(Log4jExample.class); public static void main(String[] args) < logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); >>
После запуска приложение будет регистрировать следующие сообщения как в консоли, так и в файле с именем javamaster.log:
2021-06-16 17:02:13 INFO Info log message 2021-06-16 17:02:13 ERROR Error log message
Если повысите уровень корневого журнала до ERROR:
Вывод будет выглядеть следующим образом:
2021-06-16 17:02:13 ERROR Error log message
Как видите, изменение параметра уровня логирования вверх приводит к тому, что сообщения с более низким уровнем логирования не будут печататься в приложениях.
Метод logger.error также можно использовать для регистрации произошедшего исключения:
try < // Here some exception can be thrown >catch (Exception e)
Конфигурация уровня пакета
Допустим, нужно показать сообщения с уровнем логирования TRACE – например, из определенного пакета, такого как ru.javamaster.log4j2:
logger.trace("Trace log message");
Для всех других пакетов вы хотите продолжать регистрировать только сообщения INFO. Имейте в виду, что TRACE ниже уровня корневого журнала INFO, который указали в конфигурации.
Чтобы включить логирование только для одного из пакетов, нужно добавить следующий раздел перед в log4j2.xml:
Это позволит вести журнал для пакета ru.javamaster.log4j, и вывод будет выглядеть так:
2021-06-16 17:02:13 TRACE Trace log message 2021-06-16 17:02:13 DEBUG Debug log message 2021-06-16 17:02:13 INFO Info log message 2021-06-16 17:02:13 ERROR Error log message
Logback
Logback задуман как улучшенная версия Log4j, разработанная тем же разработчиком, который создал Log4j.
Logback также имеет гораздо больше функций по сравнению с Log4j, и многие из них представлены в Log4j 2. Вот краткий обзор всех преимуществ Logback на официальном сайте.
Начнем с добавления следующей зависимости в pom.xml:
ch.qos.logback logback-classic 1.2.6
Эта зависимость транзитивно подтянет еще две зависимости: logback-core и slf4j-api. Обратите внимание, что последнюю версию Logback можно найти здесь.
Конфигурация
Посмотрим на пример конфигурации Logback:
# Console appender # Pattern of log message for console appender %d %-5p %m%n # File appender javamaster.log false # Pattern of log message for file appender %d %-5p %m%n # Override log level for specified package
Logback использует SLF4J в качестве интерфейса, поэтому необходимо импортировать Logger и LoggerFactory SLF4J.
SLF4J
SLF4J предоставляет общий интерфейс и абстракцию для большинства фреймворков логирования Java. Он действует как фасад и предоставляет стандартизированный API для доступа к базовым функциям среды логирования.
Logback использует SLF4J в качестве собственного API для своей функциональности. Ниже приведен пример использования логирования Logback:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Log4jExample < private static Logger logger = LoggerFactory.getLogger(Log4jExample.class); public static void main(String[] args) < logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); >>
Вывод останется таким же, как и в предыдущих примерах.
Log4j
Наконец, взглянем на почтенный фреймворк логирования Log4j.
На данный момент он, конечно, устарел, но его стоит обсудить, поскольку он закладывает основу для его более современных преемников.
Многие детали конфигурации соответствуют описанным в разделе Log4j 2.
Конфигурация
Прежде всего нужно добавить библиотеку Log4j в проекты pom.xml:
log4j log4j 1.2.17
Здесь можно найти последнюю версию Log4j.
Посмотрим на полный пример простой конфигурации Log4j только с одним консольным appender:
%p %m%n" />
– это открытый тег всей конфигурации, который имеет одно свойство – debug. Он определяет, хотите ли вы добавлять отладочную информацию Log4j в логи.
Применение
После того, как добавили библиотеку и конфигурацию Log4j, можно использовать логер в своем коде. Рассмотрим простой пример:
import org.apache.log4j.Logger; public class Log4jExample < private static Logger logger = Logger.getLogger(Log4jExample.class); public static void main(String[] args) < logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); >>
Заключение
В этой статье показаны очень простые примеры использования различных фреймворков логирования, таких как Log4j, Log4j2 и Logback. Она охватывает простые примеры конфигурации для всех упомянутых фреймворков.
Примеры, сопровождающие статью, можно найти на GitHub.
Логирование в Java / quick start
В ходе моей работы в компании DataArt я, в числе прочего, занимаюсь менторской деятельностью. В частности это включает в себя проверку учебных заданий сделанных практикантами. В последнее время в заданиях наметилась тенденция «странного» использования логеров. Мы с коллегами решили включить в текст задания ссылку на статью с описанием java logging best practices, но оказалось, что такой статьи в которой бы просто и без лишних деталей на практике объяснялось бы как надо писать в лог на Java, вот так вот с ходу не находится.
Данная статья не содержит каких-то откровений, в ней не рассматриваются тонкости какого либо из многочисленных java logging frameworks. Здесь рассказываю как записать в лог так, чтобы это не вызвало удивления у Ваших коллег, основная цель написания включить ее в список обязательного чтения для практикантов. Если все еще интересно, читайте дальше
- Весь код примеров использует java.util.logging framework. Вопрос «Какой из фреймворков логирования ниболее кошерен» я оставлю за кадром. Скажу только что до java.util.logging проще всего дотянуться ибо он уже идет вместе с JRE и на самом деле рассказанное в данной статье с минимальными косметическими правками верно для подавляющего большинства систем логирования.
- В целом рецепты приведенные в данной статье не являются единственно верными, есть моменты о которых можно поспорить, но в целом эти рецепты используются многие годы, многими разработчиками, во многих проектах и они достаточно хороши чтобы им следовать если у Вас нет каких-то совсем уже серьезных возражений.
- В статье не рассматриваются такие «продвинутые» топики как:
- Конфигурирование уровней для отдельных логеров
- Форматирования логов
- Асинхронное логирование
- Создание собственных уровней логирования в Log4J
- Контекстное логирование
- И многое другое
Пример №1
Хорошо
public class SomeClass < private static Logger log = Logger.getLogger(SomeClass.class.getName()); public void someMethod() < log.info("Some message"); >.
- Логер это статическое поле класса инициализируемое при загрузке класса, имеет простое, короткое имя, важно чтобы во всех Ваших классах переменная логера называлась одинаково (это диктуется общим правилом, одинаковые вещи в программе должны делаться одинаковым образом).
- В качестве имени логера я использую имя класса, на самом деле это не единственный способ, можно пытаться организовать какую-то свою иерархию логирования (например transport layer/app layer для подсистем имеющих дело с обменом данными), но как показывает практика выдумывать и главное потом неукоснительно следовать такой иерархии крайне сложно, а вариант с именами логеров совпадающими с именами классов весьма хорош и используется в 99% проектов
- Здесь для записи в лог я использую короткий метод .info, а не более общий метод .log, так много лаконичнее
- Имя логера берется как SomeClass.class.getName(), а не как «com.dataart.demo.java.logging.SomeClass», оба способа по идее одинаковы, но первый защищает Вас от сюрпризов при рефакторинге имени/пакета класса
Плохо
public class SomeClass < public void someMethod() < Logger.getLogger("com.dataart.demo.java.logging.SomeClass").log(Level.INFO,"Some message"); >.
По сути тоже самое но букв больше и читается не так легко.
Замечание между примерами
Вы наверное обратили внимание, что все сообщения в примерах на английском языке. Это не случайно. Дело в том, что даже если все-все кто работает и будет работать с Вашим кодом говорят по русски, есть вероятность, что Вам придется просматривать лог сообщения на удаленном компьютере например через ssh при этом в большом количестве случаев Вы увидите примерно такое сообщение «. . . » (я безусловно знаю что через ssh можно протащить русские буквы, но вот почему-то далеко не всегда все оказывается настроенным должным образом).
Или даже на локальной машине в cmd вы можете увидеть что вот такое:
INFO: ╨Ъ╨░╨║╨╛╨╡-╤В╨╛ ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╡ ╨▓ ╨╗╨╛╨│С этим безусловно тоже можно бороться. Но не всегда легко объяснить заказчику на том конце телефонной трубки, как сделать так чтобы вместо крякозябр были видны русские буквы.
Совет: Пишите лог сообщения на английском языке, ну или в крайнем случае латинскими буквами.Пример №2
Хорошо
try < throw new Exception("Some exception"); >catch (Exception ex) < log.log(Level.SEVERE, "Exception: ", ex); >//В стандартной лог конфигурации вы это сообщение не увидите log.fine("some minor, debug message"); /* Иногда вывод лог сообщений требует достаточно больших ресурсов (например дамп какого-то пакета данных и т.п.). В таких случаях стоит проверить выведется ли в лог сообщение для этого уровня логирования */ if (log.isLoggable(Level.FINE))
- Если Вам необходимо залогировать исключение, для этого служит метод .log(level,message,exception)
- Если вы специально не настроили конфигурацию лог системы, сообщения с уровнем ниже info, например fine выводиться не будут. Но писать их по крайней мере для важных частей системы стоит. Когда что-то пойдет не так, Вы настроите более подробный уровень логирования и увидите много интересного.
- Слишком много лог сообщений, даже если они физически не пишутся в лог файл из-за своего слишком маленького уровня, могут существенно замедлить выполнение программы. Особенно если для подготовки самого сообщения надо потратить много ресурсов. Для этого есть метод .isLoggable(level) — он позволяет узнать пропустит ли текущая конфигурация логера данное сообщение
Плохо
try < throw new Exception("Some exception"); >catch (Exception ex) < log.severe("Exception: " + ex.toString() ); >log.fine("Some CPU consuming message: " + itTakes500MillisecondsToPrepageThisMessage());
Если логировать только ex.toString(), то потом Вы не сможете понять в какой строке изначально сработало исключение.
Пример №3
Логер надо конфигурировать. Есть конфигурация по умолчанию она выводит в консоль все сообщения с уровнем INFO и выше. Она достаточно хороша, для разработки из IDE, но для реального приложения ее обычно неплохо бы подправить.
Какие тут есть варианты
По умолчанию: Файл logging.properties для уровня INFO, вывод в консоль
#Console handler
handlers= java.util.logging.ConsoleHandler
.level=INFOДелаем логирование более подробным выводим еще и сообщения уровня FINE
#Console handler
handlers= java.util.logging.ConsoleHandler
.level=FINE
java.util.logging.ConsoleHandler.level = FINE- Установили уровень FINE для корневого логера, просто чтобы сообщения пролезали внутрь лог системы.
- И сказали что все что пролезет через лог систему надо выводить на консоль от уровня FINE и выше.
Выводим лог сообщения куда-то еще
- Если приложение запускается с помощью javaw Вы вообще ничего не увидите.
- Если вывод идет в консоль и нужное вам сообщение промелькнуло 4 часа назад буфер консоли его уже съел, информация пропала.
- Если вывод консоли направлен в файл java com.yourcompanyname.EntryClass 2>>application_log.txt и приложение работает не останавливаясь несколько недель — файл будет весьма и весьма большим, рискуя занять весь диск.
Чтобы решить эти проблемы был придуман java.util.logging.FileHandler — хэндлер который выводит лог сообщения в файл. При этом он умеет ротировать файлы, т.е. после достижения максимально допустимого размера, он дописывает в файл текщуее лог сообщение и открывает новый файл с инкрементальным префиксом. И так по кругу. Например
handlers= java.util.logging.FileHandler java.util.logging.FileHandler.pattern = application_log.txt java.util.logging.FileHandler.limit = 50 java.util.logging.FileHandler.count = 7 java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
создаст вот такие файлы (последняя колонка — размер в байтах)
application_log.txt.0 │ 0 application_log.txt.1 │ 79 application_log.txt.2 │ 79 application_log.txt.3 │ 676 application_log.txt.4 │ 87 application_log.txt.5 │ 114
Мы указали максимальный размер 50 байтов, в реальной жизни надо скорее указывать не меньше мегабайта, например вот так (я знаю, что 1000000 это чуть меньше мегабайта, но кому охота по памяти писать 1048576, если суть дела это фактически не меняет)
java.util.logging.FileHandler.limit = 1000000
В примере, как мы видим, файлы получились больше 50 байт потому что размер по сути округляется вверх до последнего целого лог сообщения. Т.е. если Вы укажете размер 1 байт и запишете лог сообщение размером в 1000 байт то размер файла станет 1000 байт и после этого лог сообщения файл закроется и откроется следующий.
copy & paste конфиг для реальной жизни, его вполне хватает для большинства service, console и desktop приложений.
handlers= java.util.logging.FileHandler java.util.logging.FileHandler.pattern = application_log.txt java.util.logging.FileHandler.limit = 1000000 java.util.logging.FileHandler.count = 5 java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
Последняя часть магии
- Из командной строки запуска приложения
- В первых строчках кода Вашего приложения
Первый чуть более правильный ибо он декларативный и работает сразу, до того как начал работать код Вашего приложения.
Вот так
java Djava.util.logging.config.file=logging.properties com.dataart.application.ClassName
Но к сожалению менять строку запуска не всегда можно или не всегда удобно. Второй способ тоже неплохо работает.
public static void main(String[] args) < try < LogManager.getLogManager().readConfiguration( MainApplicationEntryClass.class.getResourceAsStream("/logging.properties")); >catch (IOException e) < System.err.println("Could not setup logger configuration: " + e.toString()); >.
- Здесь MainApplicationEntryClass — это класс — точка входа в Ваше приложение, видимо имя класса у Вас будет другое
- Сам файл logging.properties как правило в таких случаях кладется в корень иерархии классов и выглядит это например вот так
Что осталось за кадром
- Log4J
- JULI logger (строго говоря это не вполне самостоятельный фреймворк, а своего рода надстройка над java.util.logging)
- SLF4J
- Commons Logging
- Tomcat
- JBoss
- Resin