Рубрики
Без рубрики

System.out.println vs Логгерс

Узнайте о разнице между System.out.println против Loggers.

Автор оригинала: 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 .