From 3118bb3813707c4ae634a5418ae352aa4240cf4b Mon Sep 17 00:00:00 2001 From: pasha1coil Date: Mon, 14 Apr 2025 18:04:33 +0300 Subject: [PATCH] research type zap loggers --- ZAPLOGGERR.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 ZAPLOGGERR.md diff --git a/ZAPLOGGERR.md b/ZAPLOGGERR.md new file mode 100644 index 0000000..9a5e336 --- /dev/null +++ b/ZAPLOGGERR.md @@ -0,0 +1,66 @@ +# Исследование `zap.NewProduction()` и `zap.NewDevelopment()` в пакете [`uber-go/zap`](https://github.com/uber-go/zap) + +## `zap.NewProduction()` + +#### Исходя из названия предназначен для использования в **продакшн-среде** +#### Ссылка на исходный код метода [тут](https://github.com/uber-go/zap/blob/6d482535bdd97f4d97b2f9573ac308f1cf9b574e/logger.go#L100) +#### Ссылка на [NewProductionConfig](https://github.com/uber-go/zap/blob/6d482535bdd97f4d97b2f9573ac308f1cf9b574e/config.go#L157) + +#### Исходя из описания конфигурации продакшн логгера можно сделать ряд тезисов: +- Уровень логирования: Info, Warn, Error, DPanic, Panic, Fatal [ф-ция которая выставляет минимальный уровень логгирования: NewAtomicLevelAt](https://github.com/uber-go/zap/blob/6d482535bdd97f4d97b2f9573ac308f1cf9b574e/level.go#L87), [все возможные уровни](https://github.com/uber-go/zap/blob/6d482535bdd97f4d97b2f9573ac308f1cf9b574e/level.go#L30) +- Формат логов: JSON +- Стектрейсы: только для Error, DPanic, Panic, Fatal [определяется при Build в buildOptions](https://github.com/uber-go/zap/blob/6d482535bdd97f4d97b2f9573ac308f1cf9b574e/config.go#L275) +- Может использоваться совместно с агрегаторами логов которые смогут уже обрабатывать эти смые json`ы +- Поддержка Sampling: Помогает сократить поток однотипных сообщений, [дефолтные значения](https://github.com/uber-go/zap/blob/6d482535bdd97f4d97b2f9573ac308f1cf9b574e/config.go#L161) + + +## Зачем отключены `Debug`-логи и стектрейсы для `Info`, `Warn`? + +Логи в продакшне должны быть максимально **нужными и структурированными**. Избыточная отладочная информация: + +- Захламляет лог-файлы +- Замедляет работу агрегаторов логов + +Если нужно получить больше деталей — отладка должна производиться в **рабочей/тестовой среде**, где можно использовать `zap.NewDevelopment()` с `Debug`-уровнем и включёнными стектрейсами даже для предупреждений + +## `zap.NewDevelopment()` + +#### Исходя из названия предназначен для использования в **рабочей-среде** +#### Ссылка на исходный код метода [тут](https://github.com/uber-go/zap/blob/6d482535bdd97f4d97b2f9573ac308f1cf9b574e/logger.go#L108) +#### Ссылка на [NewDevelopmentConfig](https://github.com/uber-go/zap/blob/6d482535bdd97f4d97b2f9573ac308f1cf9b574e/config.go#L227) + +#### Исходя из описания конфигурации девелопмент логгера можно сделать ряд тезисов: +- Уровень логирования: Debug, Info, Warn, Error, DPanic, Panic, Fatal [ф-ция которая выставляет минимальный уровень логгирования: NewAtomicLevelAt](https://github.com/uber-go/zap/blob/6d482535bdd97f4d97b2f9573ac308f1cf9b574e/level.go#L87), [все возможные уровни](https://github.com/uber-go/zap/blob/6d482535bdd97f4d97b2f9573ac308f1cf9b574e/level.go#L30) +- Формат логов: Текст +- Стектрейсы: только для Warn, Error, DPanic, Panic, Fatal [определяется при Build в buildOptions](https://github.com/uber-go/zap/blob/6d482535bdd97f4d97b2f9573ac308f1cf9b574e/config.go#L275) +- Преимущество над production logger`ами это то что отладочная информация более расширенная + +## Какой вывод можно сделать: + +- **В продакшн-среде** рекомендуется использовать `zap.NewProduction()`: + - JSON-формат удобен для агрегаторов логов и мониторинга + - Фильтрация стектрейсов и `Debug` уровня снижает захламление + - Включён sampling, что помогает снизить нагрузку + +- **В рабочей или тестовой-среде** удобно использовать `zap.NewDevelopment()`: + - Видны все логи, включая `Debug` + - Удобный для чтения формат + - Расширенные стектрейсы + +## Примеры вывода +### Error: + +#### `zap.NewProduction()` +```json + {"level":"error","ts":1744642298.2141063,"caller":"trash/main.go:15","msg":"Hello Error","error":"some error","stacktrace":"main.main\n\tpath/main.go:15\nruntime.main\n\tpath/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.23.4.windows-amd64/src/runtime/proc.go:272"} +``` + +#### `zap.NewDevelopment()` +```json + 2025-04-14T17:53:32.591+0300 ERROR trash/main.go:15 Hello Error {"error": "some error"} +main.main +path/main.go:15 +runtime.main +path/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.23.4.windows-amd64/src/runtime/proc.go:272 +``` +