Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!04.09.2024
Пригоди з логуванням в Golang
Вже десь рік в Go є вбудований модуль для структурного логування - log/slog. Нарешті наважився на нього переїхати. (Структурне логування — це коли в лог пишуться не просто рядки, а структури. Найчастіше - JSON. Тоді з нього легко дістати будь-яке значення.)
Коли б тільки зі старого стандартного логування, то це більш-менш нескладно. Ну хіба потрібно буде шаблонні рядки перетворити на структурний синтаксис. Та де-не-де замінити log.Fatal
на щось власне, бо в slog
такого немає. Що може й непогано, бо log.Fatal
виходить з програми миттєво та пропускає всі блоки defer
- в тому числі можливо, й ті, що фіналізують журнал.
Бо логи не обовʼязково йдуть тільки у стандартний вивід. Помилки також направляються в Sentry. Є різні способи це зробити — мені подобається само надсилати логи. Sentry - чудовий сервіс, але все одно всі помилки варто бачити в журналі. Зі структурним логуванням в Sentry та в журнал йдуть практично однакові дані. Та й синтаксис slog
краще.
Для структурних логів у нас вже був logrus. Тож його теж потрібно було замінити. (Разом з його інтеграцією в Sentry.) Можливо, легше було б зробити для logrus
та log
адаптери до slog
, а потім вже поступово переписувати. Хоча мені миліше зробити все за один раз, та ще й прикрити лінтером forbidigo, щоб заборонити все, окрім slog
.
Приємно зрештою зробити все акуратно та на майбутнє залишити чіткий підхід, щоб два рази не думати — як його щось залогувати.