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. Популярні помилки у логуванні
І ще один важливий момент – популярні помилки у логуванні. Варіантів щось зробити не так є багато, але можна виділити кілька частих помилок:
- Надлишок логування. Не варто логувати кожен крок, який суто теоретично може бути важливим. Є правило: логи можуть навантажувати працездатність не більше ніж 10%. В іншому разі будуть проблеми з продуктивністю.
- Логування всіх даних в одному файлі. Це призведе до того, що в певний момент процес читання/запису в нього буде дуже складним, не кажучи про те, що існують обмеження за розміром файлів у певних системах.
- Використання неправильних рівнів логування. Кожен рівень логування має чіткі межі, і їх варто дотримуватися. Якщо межа розпливчаста, можна домовитися, який із рівнів використовувати.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ