Автор оригинала: Dhrubajyoti Bhattacharjee.
1. Почему логгеры?
При написании программы или разработке производственного приложения предприятия, используя System.out.println кажется, самый простой и простой вариант. Дополнительных библиотек для добавления в класс и дополнительных конфигураций не существует.
Но с помощью System.out.println поставляется с несколькими недостатками, которые влияют на его удобство использования во многих ситуациях. В этом учебнике мы обсудим почему и когда мы хотели бы использовать Logger над простой старой System.out и System.err . Мы также покажем несколько быстрых примеров с использованием системы регистрации Log4J2.
2. Настройка
Прежде чем мы начнем, давайте рассмотрим Maven зависимостей и конфигураций требуется.
2.1. Зависимость от Maven
Начнем с добавления зависимости Log4J2 к нашему пом.xml :
org.apache.logging.log4j log4j-api 2.12.1 org.apache.logging.log4j log4j-core 2.12.1
Мы можем найти последние версии log4j-api и log4j-основной на Maven Центральной.
2.2. Конфигурация Log4J2
Использование System.out не требует дополнительной конфигурации. Однако, чтобы использовать Log4J2, нам нужен log4j.xml файл конфигурации:
Почти все фреймворки регистратора потребуют определенного уровня конфигурации, либо программно, либо через файл внешней конфигурации, например файл XML, показанный здесь.
3. Разделение выход журнала
3.1. System.out и System.err
Когда мы развертываем наше приложение на сервере, как Tomcat, сервер использует свой собственный регистратор. Если мы используем System.out , журналы в конечном итоге в catalina.out . Гораздо проще отладить наше приложение, если журналы помещены в отдельный файл. С Log4j2 мы должны включить приложение файла в конфигурацию, чтобы сохранить журналы приложений в отдельном файле.
Кроме того, с System.out.println , нет никакого контроля или фильтрации, какие журналы должны быть напечатаны. Единственный возможный способ отделить журналы заключается в использовании System.out.println для журналов информации и System.err.println для журналов ошибок:
System.out.println("This is an informational message"); System.err.println("This is an error message");
3.2. Уровни регистрации Log4J2
В средах отладки или разработки мы хотим видеть всю информацию, которую печатает приложение. Но в живом корпоративном приложении больше журналов означает увеличение задержки. Рамки Logger, такие как Log4J2, обеспечивают несколько элементов управления уровнем журнала:
- роковой
- ошибка
- предупреждать
- информация
- отлаживать
- след
- все
Используя эти уровни, мы можем легко фильтровать, когда и где печатать, какая :
logger.trace("Trace log message"); logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); logger.warn("Warn log message"); logger.fatal("Fatal log message");
Мы также можем настроить уровни для каждого пакета исходных кодов по отдельности. Для получения более подробной информации о конфигурации уровня журнала обратитесь к нашей статье Java Logging.
4. Написание журналов в файлы
4.1. Система перенаправления.out и System.err
Можно маршрут System.out.println в файл с помощью System.setOut() метод:
PrintStream outStream = new PrintStream(new File("outFile.txt")); System.setOut(outStream); System.out.println("This is a baeldung article");
А в случае System.err :
PrintStream errStream = new PrintStream(new File("errFile.txt")); System.setErr(errStream); System.err.println("This is a baeldung article error");
При перенаправлении вывода в файл с помощью System.out или System.err , мы не можем контролировать размер файла , Таким образом, файл продолжает расти в течение всего срока действия приложения.
По мере роста размера файла может быть трудно открыть или проанализировать эти большие журналы.
4.2. Вход в файлы с Log4J2
Log4J2 предоставляет механизм систематического записи журналов в файлах, а также свертывать файлы на основе определенных политик. Например, мы можем настроить файлы, которые будут перенесены на основе шаблона даты/времени :
Или мы можем свернуть файлы в зависимости от размера, как только они достигнут данного порога :
...%d{yyyy-MM-dd HH:mm:ss} %p %m%n
5. Вход во внешние системы
Как мы видели в предыдущем разделе, фреймворки регистраторов позволяют записывать журналы в файл. Аналогичным образом, они также обеспечивают приложения для отправки журналов в другие системы и приложения . Это позволяет отправлять журналы в kafka Stream или базу данных Elasticsearch с помощью приложений Log4J, а не с помощью System.out.println.
Пожалуйста, обратитесь к нашей статье Log4j приложения для получения более подробной информации о том, как использовать такие приложения.
6. Настройка вывода журнала
С помощью Loggers, мы можем настроить, какая информация должна быть напечатана вместе с фактическим сообщением. Информация, которую мы можем распечатать, включает имя пакета, уровень журнала, номер строки, таймштамп, название метода и т.д.
Хотя это было бы возможно с System.out.println, это потребует много ручной работы, в то время как рамки регистрации обеспечивают эту функциональность из коробки. С лесозаготовителями, мы можем просто определить шаблон в конфигурации регистратора :
Если мы рассмотрим Log4J2 для нашей структуры регистратора, есть несколько шаблонов, которые мы можем выбрать или настроить. Обратитесь к официальная документация Log4J2 чтобы узнать больше о них.
7. Избегайте печатиStackTrace () путем регистрации исключение выход вместо
Когда мы обрабатываем исключения в нашем коде, нам часто нужно узнать, какие исключения на самом деле произошли во время выполнения. Для этого есть два общих варианта: РаспечататьСтакТрайс () или с помощью вызова регистратора.
Довольно часто можно увидеть обработку исключений, которая использует РаспечататьСтакТрайс () для печати подробной информации об исключении:
try { // some code } catch (Exception e) { e.printStackTrace(); }
Проблема здесь в том, что РаспечататьСтакТрайс () печатает свою информацию на System.err , и мы уже сказали, что хотим избежать этого.
Вместо этого мы можем войти в исключение с помощью основы регистрации, а затем мы сможем легко получить журналы:
try { // some code } catch (Exception e) { logger.log("Context message", e); }
8. Заключение
В этой статье объясняется, почему использовать структуру регистратора и почему бы не полагаться только на System.out.println для наших журналов приложений. Хотя это оправдано использовать System.out.println для небольших тестовых программ мы предпочитаем не использовать его в качестве основного источника регистрации для приложения корпоративного производства.
Как всегда, примеры кода в статье доступны более на GitHub .