45 lines
1.4 KiB
Go
45 lines
1.4 KiB
Go
// Package logging настраивает структурное логирование через log/slog.
|
||
//
|
||
// Логгер ставится дефолтным, чтобы пакеты писали slog.Info(...) без
|
||
// протаскивания логгера через все сигнатуры — в Go это принятое решение.
|
||
package logging
|
||
|
||
import (
|
||
"log/slog"
|
||
"os"
|
||
"strings"
|
||
)
|
||
|
||
// Setup создаёт корневой логгер и делает его дефолтным.
|
||
//
|
||
// LOG_LEVEL — debug | info | warn | error (по умолчанию info);
|
||
// LOG_FORMAT — text | json (по умолчанию text: читаемо в консоли,
|
||
// json выбирают, когда логи собирает агрегатор).
|
||
func Setup() *slog.Logger {
|
||
opts := &slog.HandlerOptions{Level: levelFromEnv()}
|
||
|
||
var handler slog.Handler
|
||
if strings.EqualFold(strings.TrimSpace(os.Getenv("LOG_FORMAT")), "json") {
|
||
handler = slog.NewJSONHandler(os.Stdout, opts)
|
||
} else {
|
||
handler = slog.NewTextHandler(os.Stdout, opts)
|
||
}
|
||
|
||
logger := slog.New(handler)
|
||
slog.SetDefault(logger)
|
||
return logger
|
||
}
|
||
|
||
func levelFromEnv() slog.Level {
|
||
switch strings.ToLower(strings.TrimSpace(os.Getenv("LOG_LEVEL"))) {
|
||
case "debug":
|
||
return slog.LevelDebug
|
||
case "warn", "warning":
|
||
return slog.LevelWarn
|
||
case "error":
|
||
return slog.LevelError
|
||
default:
|
||
return slog.LevelInfo
|
||
}
|
||
}
|