Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 Контент вільний від AI. Цей пост на 100% написаний людиною, як і все на моєму блозі. Насолоджуйтесь!

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.

Приємно зрештою зробити все акуратно та на майбутнє залишити чіткий підхід, щоб два рази не думати — як його щось залогувати.