
В этой статье мы изучим такую библиотеку логирования для JVM-языков, как Log4j. Но прежде чем говорить о Log4j, давайте выясним, что вообще такое логирование и для чего оно нужно.
Ведение журнала, или логирование, – это процесс записи событий, сообщений или действий, происходящих во время выполнения программы или работы какой-либо системы. В этих сообщениях содержится подробная информация о поведении приложения, возникающих ошибках и других важных событиях. Логирование – важнейший аспект разработки программного обеспечения, так как оно помогает отлаживать, контролировать и лучше понимать поведение приложения.
Друзья, поддержите нас вступлением в наш телеграм канал QaRocks. Там много туториалов, задач по автоматизации и книг по QA.
Вот некоторые ключевые аспекты логирования:
- Отладка. Разработчики используют логи для отслеживания хода выполнения кода, выявления проблем и их отладки. Изучая логи, разработчики могут получить представление о состоянии приложения, последовательности операций и возникших ошибках.
- Мониторинг и анализ. Логи ценны для мониторинга производительности и работоспособности приложения в производственной среде. Они помогают выявить “узкие места”, отследить использование ресурсов и предоставить информацию, необходимую для оптимизации производительности.
- Безопасность. Логирование необходимо для аудита безопасности и обнаружения потенциальных угроз. События, связанные с безопасностью, такие как попытки входа в систему, сбои авторизации или другие подозрительные действия, могут регистрироваться в логах, что помогает выявлять и реагировать на случаи угрозы безопасности.
- Соответствие требованиям. Приложения многих отраслей подчиняются нормативным требованиям, которые предписывают записывать и сохранять определенные события. Ведение журналов помогает соответствовать стандартам и обеспечивает аудиторский след деятельности системы.
- Устранение неполадок. Когда пользователи сталкиваются с проблемами в работе приложения, службы поддержки могут использовать логи для диагностики основной причины и анализа последовательности событий, приведших к возникновению неполадки.
А теперь приступим непосредственно к изучению Log4j.
Log4j (сокращенно от Apache Log4j) – это утилита логирования на базе Java, обеспечивающая гибкую и масштабируемую структуру для протоколирования в Java-приложениях. Она является частью большого проекта Apache Logging Services Project компании Apache Software Foundation. Отличительными чертами Log4j являются: эффективност, настраиваемость и масштабируемость.
Основные возможности Log4j включают:
- Уровни логирования. Log4j поддерживает различные уровни логирования, такие как DEBUG, INFO, WARN, ERROR и FATAL. Разработчики могут выбрать подходящий уровень в зависимости от серьезности сообщения.
- Иерархическое логирование. Логгеры в Log4j организованы иерархически, что позволяет разработчикам контролировать детализацию вывода логов. Такая иерархическая структура позволяет более тонко контролировать отображение сообщений логов.
- Аппендеры. Log4j использует концепцию аппендеров для определения места вывода сообщений. Аппендеры могут быть настроены на отправку сообщений логов в различные места назначения, такие как файлы, консоль, удаленные серверы или пользовательские места назначения.
- Макеты. Log4j позволяет разработчикам определять формат сообщений логов с помощью макетов. Это позволяет настраивать содержание и внешний вид сообщений.
- Конфигурация. Log4j поддерживает конфигурацию через XML, JSON или файлы свойств. Это позволяет легко настраивать параметры логирования без изменения кода приложения.
- Производительность. Log4j разработан для обеспечения эффективности, минимизируя влияние на производительность приложения. Он включает такие функции, как асинхронное логирование, для дальнейшего повышения производительности.
В Logj4 существуют различные уровни логов. Уровни логов – это категории, которые указывают на важность регистрируемых сообщений. Они используются для управления степенью подробности и важности регистрируемой информации. Ниже приведены основные уровни, используемые в Log4j, и их значения:

TRACE:
- Самый низкий уровень
- Используется для регистрации очень детальной информации
- Обычно используется для подробной трассировки потока приложений
DEBUG:
- Используется для регистрации подробной информации о работе приложения
- Полезен на этапах разработки и отладки
INFO:
- Используется для предоставления информации пользователю во время текущей работы
- Указывает на значимые события и состояния системы
WARN:
- Содержит в себе различные предупреждения
- Записи в логе этого уровня не обязательно препятствуют нормальной работе приложения, но выделяют ситуации, на которые следует обратить внимание.
ERROR:
- Указывает на наличие ошибок
- Записи в журнале этого уровня указывают на то, что часть или все приложение функционирует не так, как ожидалось
FATAL:
- Указывает на критические ошибки
- Записи в журнале этого уровня обычно указывают на ситуацию, когда приложение аварийно завершает работу или сталкивается с критической ошибкой, препятствующей дальнейшей работе
Уровни логов определяются при настройке логирования и используются для управления тем, какие сообщения логов будет отображать или записывать приложение. Например, при разработке уровни TRACE и DEBUG могут предоставлять более подробную информацию, в то время как в производстве эти уровни часто устанавливаются на INFO. Это позволяет настроить вывод логов и ограничить ненужную информацию, повысить производительность и сделать файлы логов более управляемыми.
Приведем один пример, после которого все станет ясно.
Добавим зависимости Logj4 в файл pom.xml:
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.12.4</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.12.4</version> </dependency> </dependencies>
И создадим класс с именем Log4jExample:

Далее в файле ресурсов создадим файл с именем log4j2.xml:


<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" /> </Console> <RollingFile name="InfoFile" fileName="log/mobileLogs.log" filePattern="${logPath}/%d{YYYYMMddHHmmss}-fargo.log"> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" /> <Policies> <SizeBasedTriggeringPolicy size="100 MB" /> </Policies> <DefaultRolloverStrategy max="20" /> </RollingFile> </Appenders> <Loggers> <Root level="trace"> <AppenderRef ref="Console" level="Trace" /> </Root> </Loggers> </Configuration>
В данном примере наш Root level = “trace”. Это означает, что мы будем видеть все уровни в последовательности trace->debug->info->warn->error->fatal, так как trace – самый низкий из них.
Наконец, перейдем к нашему классу:

На этом этапе импортируем LogManager и Logger из библиотеки Log4j.
В строке 7 создается объект logger. Этот объект будет использоваться для выполнения операций логирования для класса Log4jExample.
Запускаем наш код:

Как видно, в файле Log4jExample была создана папка с именем log. Внутри этой папки находится файл с именем mobileLogs. Теперь вы можете спросить: “Почему имя файла mobileLogs?”. Ответ заключается в том, что в нашем xml-файле в строке 7 (опять 7, да) мы задаем это имя. По сути оно может быть любым.
Например, мы хотим видеть только фатальные сообщения в проекте. Для этого мы можем изменить наш xml-файл. Если мы изменим строку 18 следующим образом: <Root level=”fatal”>, то будем видеть только логи уровня FATAL. Кроме того, просматривая логи, мы сможем увидеть, когда произошло фатальное событие, в каком классе и какой строке.
Запустим код еще раз:

Надеемся, эта статья помогла вам расширить знания о логировании и библиотеке Log4j.
Перевод статьи «Log4j».