Go Linter, который обеспечивает последовательный стиль кода при использовании log/slog .
API log/slog позволяет два разных типа аргументов: пары и атрибуты клавиш. Хотя у людей могут быть разные мнения о том, какие из них лучше, большинство, кажется, согласны с одной вещью: это должно быть последовательным. С помощью sloglint вы можете обеспечить различные правила для log/slog на основе вашего предпочтительного стиля кода.
sloglint интегрирован в golangci-lint , и это рекомендуемый способ его использовать.
Чтобы включить Linter, добавьте следующие линии в .golangci.yml :
linters :
enable :
- sloglint В качестве альтернативы, вы можете загрузить предварительно построенный двоичный файл со страницы релизов, чтобы использовать sloglint Sandalone.
Запустите golangci-lint с включенным sloglint . См. Список доступных параметров для настройки Linter.
При использовании sloglint автономно передайте параметры как флаги с одноименным именем.
Вариант no-mixed-args заставляет sloglint сообщать о смешивании пар клавишных значений и атрибутов в рамках одного вызова функции:
slog . Info ( "a user has logged in" , "user_id" , 42 , slog . String ( "ip_address" , "192.0.2.0" )) // sloglint: key-value pairs and attributes should not be mixedОн включен по умолчанию.
Опция kv-only заставляет sloglint сообщать о любом использовании атрибутов:
slog . Info ( "a user has logged in" , slog . Int ( "user_id" , 42 )) // sloglint: attributes should not be used В отличие от этого, вариант attr-only заставляет sloglint сообщать о любом использовании пар клавишных значений:
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: key-value pairs should not be used Некоторые проекты предпочитают передавать регистраторов в качестве явных зависимостей. Опция no-global sloglint к сообщению об использовании глобальных регистраторов.
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: global logger should not be used all возможные значения (отчет о всех глобальных регистраторах) и default (сообщают только о slog регистрации по умолчанию).
context.Context реализации slog.Handler Чтобы они работали должным образом, вам нужно передать контекст всем вызовам регистрации. Опция context-only заставляет sloglint сообщать о использовании методов без контекста:
slog . Info ( "a user has logged in" ) // sloglint: InfoContext should be used instead Возможные значения - all (сообщают о всех контекстных вызовах) и scope (отчет только в том случае, если контекст существует в области самой внешней функции).
Чтобы получить максимальную отдачу от структурированных журналов, вы можете потребовать, чтобы сообщения журнала были статичными. Вариант static-msg заставляет sloglint сообщать о нестатических сообщениях:
slog . Info ( fmt . Sprintf ( "a user with id %d has logged in" , 42 )) // sloglint: message should be a string literal or a constantОтчет может быть фиксирован путем перемещения динамических значений в аргументы:
slog . Info ( "a user has logged in" , "user_id" , 42 ) Чтобы предотвратить опечатки, вы можете полностью запретить использование необработанных клавиш. Вариант no-raw-keys заставляет sloglint сообщать об использовании строк в качестве ключей (включая вызовы slog.Attr , например slog.Int("user_id", 42) ):
slog . Info ( "a user has logged in" , "user_id" , 42 ) // sloglint: raw keys should not be usedЭтот отчет может быть исправлен с использованием любых констант ...
const UserId = "user_id"
slog . Info ( "a user has logged in" , UserId , 42 ) ... или настраиваемые конструкторы slog.Attr :
func UserId ( value int ) slog. Attr { return slog . Int ( "user_id" , value ) }
slog . Info ( "a user has logged in" , UserId ( 42 ))Кончик
Такие помощники могут быть автоматически сгенерированы для вас с помощью инструмента sloggen . Попробуйте!
Чтобы обеспечить согласованность в журналах, вы можете обеспечить соблюдение единого соглашения о именованиях. Параметр key-naming-case приводит к тому, что sloglint сообщает ключи, записанные в случае, отличном от данного:
slog . Info ( "a user has logged in" , "user-id" , 42 ) // sloglint: keys should be written in snake_case Возможными значениями являются snake , kebab , camel или pascal .
Чтобы предотвратить случайное использование зарезервированных бревенчатых ключей, вы можете полностью запретить конкретные ключи. Опция forbidden-keys заставляет sloglint сообщать об использовании запрещенных ключей:
slog . Info ( "a user has logged in" , "reserved" , 42 ) // sloglint: "reserved" key is forbidden and should not be used Например, при использовании стандартного slog.JSONHandler и slog.TextHandler вы можете запретить time , level , msg и source клавиши, так как они используются обработчиками.
Чтобы улучшить читаемость кода, вы можете поставить аргументы в отдельные строки, особенно при использовании пар клавиш. Опция args-on-sep-lines sloglint к сообщению 2+ аргументов на той же строке:
slog . Info ( "a user has logged in" , "user_id" , 42 , "ip_address" , "192.0.2.0" ) // sloglint: arguments should be put on separate linesЭтот отчет может быть исправлен путем переформатирования кода:
slog . Info ( "a user has logged in" ,
"user_id" , 42 ,
"ip_address" , "192.0.2.0" ,
)