Мощный анализатор кода для проверки соглашений о логировании в Go. Поддерживает оба логгера: log/slog и go.uber.org/zap с интерфейсом Sugar().
Проверка нижнего регистра - Сообщения лога должны начинаться со строчной буквы
Проверка английского языка - Сообщения лога должны быть на английском (без кириллицы)
Проверка спецсимволов - Обнаружение запрещённых спецсимволов
Проверка чувствительных данных - Предотвращает логирование конфиденциальной информации
SuggestedFix - Автоматическое исправление нарушений нижнего регистра
Интеграция с golangci-lint - Работает как кастомный плагин линтера
Поддержка множества логгеров - log/slog, go.uber.org/zap и обёртки
go get github.com/Hirogava/Go-Log-Linter# Собрать линтер
make build
# Проверить проект из его директории
cd your_project
../bin/loglint ./...
cd ..
# Или проверить конкретный пакет
cd your_project
../bin/loglint ./cmd/...
../bin/loglint ./internal/...
cd ..Windows (PowerShell):
# Собрать
$env:GOOS="windows"; $env:GOARCH="amd64"; go build -o .\bin\loglint.exe .\cmd\loglint
# Проверить
cd your_project
..\bin\loglint.exe ./...
cd ..Linux/macOS:
# Собрать
GOOS=linux GOARCH=amd64 go build -o ./bin/loglint ./cmd/loglint
# Проверить
cd your_project
../bin/loglint ./...
cd ..# Собрать плагин
make build-plugin
# Добавить в .golangci.yml (см. конфигурацию ниже)
# Запустить
golangci-lint runpackage main
import (
"github.com/Hirogava/Go-Log-Linter/analyzer"
"golang.org/x/tools/go/analysis/singlechecker"
)
func main() {
singlechecker.Main(analyzer.Analyzer)
}# Собрать CLI линтер
make build
# Использовать
./bin/loglint ./cmd/...
./bin/loglint ./analyzer/...Линтер поддерживает следующие конфигурационные флаги:
| Флаг | Тип | По умолчанию | Описание |
|---|---|---|---|
allow-exclamation |
bool | false | Разрешить восклицательные знаки в конце логов |
allowed-special-chars |
string | "" | Дополнительные разрешённые спецсимволы (например: "!@#") |
custom-sensitive |
strings | [] | Дополнительные чувствительные ключевые слова |
strict |
bool | false | Строгий режим с дополнительными проверками |
ignore-numbers |
bool | false | Игнорировать числа при проверке спецсимволов |
# С флагами (при использовании как отдельный инструмент)
go run ./cmd/loglint -allow-exclamation -allowed-special-chars="!@#" ./...
# Или через golangci-lint
golangci-lint run --linter-settings=loglint.allow-exclamation=true ./...Для использования в ВАШИХ проектах создайте .golangci.yml:
linters-settings:
custom:
loglint:
path: ./loglint.so
description: "Анализатор логов для проверки соглашений о логировании"
linters:
enable:
- loglintРазрешить восклицательные знаки:
# .golangci.yml
linters-settings:
custom:
loglint:
path: ./loglint.soФлаги передаются через CLI: golangci-lint run --linter-settings 'loglint.allow-exclamation=true'
Через CLI при использовании как отдельный инструмент:
./bin/loglint -allow-exclamation ./...Или через golangci-lint:
golangci-lint run --linter-settings 'loglint.allow-exclamation=true'Добавить собственные чувствительные ключевые слова:
Отредактируйте конфигурацию в analyzer/config.go или передайте через программный API:
import "github.com/Hirogava/Go-Log-Linter/analyzer"
config := &analyzer.Config{
CustomSensitive: []string{"customer_id", "credit_card"},
}Сообщения логов должны начинаться со строчной буквы.
Неправильно:
logger.Info("Database connection failed")
logger.Error("API request timeout")Правильно:
logger.Info("database connection established")
logger.Error("api request timeout")Исправление: Автоматическое - первая буква будет переведена в нижний регистр.
Сообщения логов должны быть на английском языке (без кириллицы).
Неправильно:
logger.Error("Ошибка при обработке запроса")
logger.Warn("Пользователь не найден")Правильно:
logger.Error("error processing request")
logger.Warn("user not found in database")Разрешены только следующие спецсимволы: ., -, _, : + дополнительные из конфигурации
Неправильно:
logger.Info("invalid @character in message")
logger.Error("error #tag not allowed")
logger.Warn("price $100 invalid")Правильно:
logger.Info("user operation completed successfully")
logger.Error("process-timeout: retry in 30s")
logger.Warn("db.connection_pool.size=100")Конфигурация: Добавьте дополнительные символы через allowed-special-chars="!@#" флаг
Предотвращает логирование конфиденциальной информации вроде паролей, токенов, ключей API.
Чувствительные ключевые слова:
passwordtokenapi_keysecret
Неправильно:
logger.Info("user password is incorrect")
logger.Error("api_key validation failed")Правильно:
logger.Info("user authentication required")
logger.Error("authorization validation failed")- Пакет
log/slog go.uber.org/zap(структурированное логирование и Sugar API)
import (
"log/slog"
"go.uber.org/zap"
)
// slog - структурированное логирование
logger := slog.Default()
logger.Info("database connection established")
// zap - структурированное логирование
logger, _ := zap.NewProduction()
logger.Info("database connection established")
// zap sugar - форматированное логирование
sugar := logger.Sugar()
sugar.Info("database connection established")Go-Log-Linter/
├── go.mod # Определение модуля
├── go.sum # Хеши зависимостей
├── Makefile # Команды сборки
├── README.md # Этот файл
├── .golangci.yml # Конфигурация golangci-lint
│
├── cmd/
│ └── loglint/
│ └── main.go # CLI инструмент для прямого использования
│
├── analyzer/
│ ├── analyzer.go # Главный анализатор с интеграцией конфигурации
│ ├── config.go # Структура Config и управление конфигурацией
│ ├── config_test.go # Тесты конфигурации
│ ├── logger_detector.go # Детектор slog/zap логгеров
│ ├── logger_detector_test.go
│ ├── utils.go # Утилиты (парсинг строк и т.д.)
│ ├── analyzer_test.go # Тесты анализатора
│ ├── testdata_test.go # Интеграционные тесты
│ └── rules/
│ ├── rules.go # Реализация всех 4 правил + Checker
│ └── rules_test.go # Unit тесты правил (27+ тест-кейсов)
│
├── plugin/
│ └── main.go # Обёртка плагина для golangci-lint
│
└── testdata/ # Интеграционные test fixtures
├── lowercase/
│ ├── bad.go # Нарушение нижнего регистра
│ └── good.go # Правильный нижний регистр
├── english/
│ ├── bad.go # Кириллица в логах
│ └── good.go # Только английский
├── special/
│ ├── bad.go # Запрещённые спецсимволы
│ └── good.go # Разрешённые спецсимволы
├── sensitive/
│ ├── bad.go # Конфиденциальные данные
│ └── good.go # Безопасное логирование
├── zap/
│ ├── bad.go # Нарушения при использовании Zap
│ └── good.go # Правильный Zap
└── slog/
├── bad.go # Нарушения при использовании slog
└── good.go # Правильный slog
- Config: Управление конфигурацией линтера (5 параметров)
- RuleConfig Interface: Интерфейс для передачи конфигурации правилам
- Checker: Фабрика для создания правил с учётом конфигурации
- Rules: 4 основных правила проверки логов
- Logger Detector: Поддержка slog и zap логгеров
Используйте линтер в своём коде:
package main
import (
"github.com/Hirogava/Go-Log-Linter/analyzer"
"golang.org/x/tools/go/analysis"
)
func main() {
// Создать конфигурацию
config := analyzer.DefaultConfig()
config.AllowExclamation = true
config.AllowedSpecialChars = "!@#"
config.CustomSensitive = []string{"credit_card", "ssn"}
// Использовать анализатор с конфигурацией
a := analyzer.Analyzer
// ... использовать анализатор
}- Config система: Централизованная конфигурация со значениями по умолчанию
- RuleConfig интерфейс: Позволяет правилам получать доступ к конфигурации
- Checker фабрика: Создаёт правила с учётом конфигурации
- Logger Detector: Автоматически обнаруживает slog и zap вызовы
- Analyzer: Интегрирует всё вместе через golang.org/x/tools/go/analysis
Использование Makefile (Linux/macOS):
make build # Собрать CLI инструмент для Linux
make build-plugin # Собрать плагин для golangci-lint
make build-windows # Собрать для Windows
make test # Запустить тесты
make clean # Очистить артефакты сборкиWindows (PowerShell):
make build-windows # или вручную:
$env:GOOS="windows"; $env:GOARCH="amd64"; go clean ./...; go build -o .\bin\loglint.exe .\cmd\loglintLinux:
make build-linux # или вручную:
GOOS=linux GOARCH=amd64 go build -o ./bin/loglint ./cmd/loglintmacOS:
make build-macos # или вручную:
GOOS=darwin GOARCH=amd64 go build -o ./bin/loglint ./cmd/loglintДиректория testdata содержит тест-кейсы для каждого правила. Каждая категория включает:
bad.go- Примеры, которые должны вызвать ошибки анализатораgood.go- Примеры, которые должны пройти успешно
Все тесты описаны через комментарии // want которые указывают ожидаемые ошибки.
Чтобы добавить новое правило:
- Создайте структуру в
analyzer/rules/rules.go:
type CustomRule struct {
config RuleConfig
}
func (r *CustomRule) Check(msg string) error {
// Ваша логика проверки
return nil
}
func (r *CustomRule) GetSuggestedFix(msg string) string {
// Простые исправления
return msg
}-
Добавьте правило в
Checker.rulesсписок вNewChecker() -
Добавьте тесты в
rules_test.go -
Добавьте тестовые примеры в
testdata/custom_rule/bad.goиgood.go
- Go: 1.24 или выше
- Для плагина golangci-lint: Linux или macOS (Windows не поддерживает
-buildmode=plugin) - golangci-lint: v1.50+ (для интеграции плагина)
- 4 основных правила реализованы
- Система конфигурации реализована (5 параметров)
- Поддержка slog и zap логгеров
- Интеграция с golangci-lint
- 150+ тест-кейсов
- Документация (русский язык)
- SuggestedFix поддержка
v1.0.0 - Добавлена система конфигурации и расширенная функциональность
Hirogava