Go 1.21 - аттракцион невиданной щедрости (версия выйдет уже через месяц -другой)



Я уже писал про работу со слайсами и мапами в 1.21 (теперь можно из коробки найти элемент в списке!!!!111111). Т.е. не прошло и 10 лет, как стандартная библиотека наполнилась самыми необходимыми, самыми базовыми функциями. Я чуть не разрыдался от счастья.



Так вот, недавно туда же включили и нормальный логгер!



Чтоб вы понимали, я видел опросники для собесов по Go, где один из стандартных вопросов был "расскажите, почему встроенный логгер такое говно, что его никто не использует".



Его никто не использует, потому что они ничего не может. В итоге у всех в проектах появились сторонние решения zerolog, logrus и т.д.



В новой версии Go добавили пакет log/slog (игра слов: slog переводится как "вкалывать", "утомительный"), в котором есть:



- уровни severity: Debug, Info, Warn, Error (или можно использовать любое integer-число)



- возможность использовать Handler: textHandler, jsonHandler или свой собственный, удовлетворяющий интерфейсу Handler



- встроенная возможность передачи ключ-значение:



// здесь message - это "hello",

// и еще приделывается ключ-значение count=3

logger.Info("hello", "count", 3)



если использовать вместе с json-хандлером, то вывод будет такой:



{"time":"2022-11-08T15:28:26.000000000-05:00","level":"INFO","msg":"hello","count":3}



- эти ключи-значения можно группировать, и получать вложенный джейсон (slog.Group)



- можно выводить лог с контекстом

// slog.InfoCtx(ctx, "message", "key", val)



- всякие фишечки для удобства и производительности, например метод With, который возвращает sub-логгер, при создании которого можно сразу задать некоторые атрибуты. Встроенные хандлеры отформатируют их один раз.



В общем, в своих проектах я, пожалуй, выкину zerolog, потому что встроенного логгера мне вроде бы теперь хватает.



Кстати, все эти нововведения стали возможны благодаря тому, что в 1.19 сделали дженерики. Даже если они в продуктовом коде большинству не нужны, то для общих библиотек - must have