1. Список рівнів логування

Ви написали свою програму, залили її на сервер, і у вас одразу починають виникати запитання:

  • Як зробити так, щоб debug() метод не відпрацьовував під час роботи у production?
  • У логах занадто багато інформації: як залишити лише повідомлення про помилки?
  • Як побачити детальний лог про одну частину програми?

Зрозуміло, творці логів зіткнулися з усім цим ще десятки років тому. Не розповідатиму, як цю проблему вирішили в мові C, але в мові Java її вирішили дуже красиво.

Лог фільтрує дані перед тим, як записувати інформацію у файл. Можна швидко зменшити/збільшити деталізацію лога за допомогою налаштування рівня логування. Ці рівні описані в таблиці нижче:

Рівень Примітка
1 ALL Писати в лог всі повідомлення
2 TRACE Дрібне повідомлення під час налагодження (дебагу)
3 DEBUG Повідомлення, важливі при налагодженні
4 INFO Прості повідомлення
5 WARN Писати лише fatal, error та warning
6 ERROR Писати лише помилки та фатальні помилки
7 FATAL Писати лише фатальні помилки
8 OFF Не писати в лог повідомлення

Ці рівні використовуються для фільтрації повідомлень. Якщо виставити рівень логування в WARN, всі повідомлення, менш важливі за WARN, відкинуться: TRACE, DEBUG, INFO. Якщо виставити рівень фільтрації FATAL, відкинуться навіть ERROR’и.

Є ще два рівні важливості, які використовуються при фільтрації – це OFF (відкинути всі повідомлення) та ALL – писати всі повідомлення (не відкидати нічого).

2. Приклад налаштування лога

Розглянемо простий приклад налаштування лога. Для цього нам знадобиться файл log4j.properties, який можна розмістити в папці resources. Додамо до нього такий зміст:


# Root logger option
log4j.rootLogger=WARN, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}

Ось тут у першому рядку ми і встановлюємо рівень логування – WARN. А це означає, що повідомлення, які пишуться в логер зі статусом DEBUG і INFO проігноруються.

  • Вказуємо, який тип апендера будемо використовувати – ConsoleAppender
  • Вказуємо, куди писатимемо лог – System.out
  • Зазначаємо клас, який керуватиме форматом запису – PatternLayout
  • Вказуємо формат запису для всіх повідомлень – дата та час

3. Популярні помилки у логуванні

І ще один важливий момент – популярні помилки у логуванні. Варіантів щось зробити не так є багато, але можна виділити кілька частих помилок:

  1. Надлишок логування. Не варто логувати кожен крок, який суто теоретично може бути важливим. Є правило: логи можуть навантажувати працездатність не більше ніж 10%. В іншому разі будуть проблеми з продуктивністю.
  2. Логування всіх даних в одному файлі. Це призведе до того, що в певний момент процес читання/запису в нього буде дуже складним, не кажучи про те, що існують обмеження за розміром файлів у певних системах.
  3. Використання неправильних рівнів логування. Кожен рівень логування має чіткі межі, і їх варто дотримуватися. Якщо межа розпливчаста, можна домовитися, який із рівнів використовувати.