Áttekintés
A logx önálló Go modul (github.com/gp-system/logx, +logx/monolog): egy kis eszközkészlet a default log/slog logger komponálásához. Három kombinátor (ConsoleHandler, LevelFilter, Fanout) ad konzolformátum-váltót, minimum-szint kaput és egy Monolog-stílusú, több-handleres stacket, mind sima slog.Handler értékként. Fölötte a logx/monolog egy önálló formázó, ami [dátum] channel.SZINT: üzenet {context} sorokat rendel, PHP-stílusban, egy errs hibából kinyert, teljes útvonalú stack trace-szel.
Korábban a telemetry logx nevű alcsomagjaként élt; azóta önálló modulba költözött, mert egy konzol-logger komponálásának semmi köze az OpenTelemetryhez vagy a Sentry-bekötéshez, és egy programnak, ami csak olvasható konzollogot akar, nem kéne emiatt az OTel SDK-t vagy a sentry-go-t behúznia. A telemetry.Setup ugyanúgy használja a logx-et, mint eddig, csak modul-függőségként, nem alcsomagként: a futásidejű viselkedésen semmi nem változott, csak azon, melyik modulban él a kód.
Az egyetlen függősége az errs, és azt is csak a logx/monolog használja: a formázó az errs.CodeOf-ot olvassa és az errs.FullFrames/errs.Frame-en át járja be egy becsomagolt hiba stackjét. Maga a logx csomag (ConsoleHandler, LevelFilter, Fanout, Config) a standard libraryn túl semmit nem importál.
Telepítés
go get github.com/gp-system/logx@main # még nincs taggelt release
| Import-út | Mit ad hozzá |
|---|---|
github.com/gp-system/logx | a slog-kompozíciót: ConsoleHandler, LevelFilter, Fanout, Config |
github.com/gp-system/logx/monolog | a PHP/Monolog-stílusú konzol-formázót, önmagában is sima slog.Handler-ként használható |
Konfiguráció
A logx.Config nem hordoz saját env-prefixet: a változók arra vannak szánva, hogy prefix nélkül, a legfelső szinten ágyazódjanak be, bármi is komponálja őket (a frameworkben a telemetry.Config Log mezőjeként).
| Változó | Default | Jelentés |
|---|---|---|
LOG_LEVEL | INFO | a logger minimális szintje (a fanout minden handlerére érvényes) |
LOG_STDOUT | false | prod módban is írjon konzolra (JSON); hagyd kikapcsolva, ha a collector a konténer-kimenetet szedi, különben duplán ingesztálsz |
LOG_FORMAT | üres (auto) | a konzol-formátum: üresen szöveg dev módban / JSON prodban; monolog → Monolog-stílusú sorok, módtól függetlenül |
Ismeretlen LOG_FORMAT értékre a Config.Validate() hibával áll le, nem csendben esik vissza.
A kompozíció: Fanout és LevelFilter
Három kis slog.Handler-kombinátor a teljes csomag:
func ConsoleHandler(w io.Writer, cfg Config, dev bool, channel string) slog.Handler
func Fanout(handlers ...slog.Handler) slog.Handler // több handler, egy-egy rekordklón mindnek
func LevelFilter(min slog.Level, next slog.Handler) slog.Handler // minimum-szint kapu
A LevelFilter azért létezik, mert nem minden leaf-handler szűr magától (egy OTLP bridge például mindent továbbít, amit kap): tedd legkívülre, és minden mögötte lévő handler csak a minimum szint fölötti rekordokat látja. A Fanout minden handlernek a rekord saját klónját adja, és az Enabled-et handlerenkénti gate-ként tiszteli; egyetlen handler esetén allokáció nélkül, önmagaként tér vissza.
Használat
Sima Go program, framework és telemetry nélkül:
package main
import (
"log/slog"
"os"
"github.com/gp-system/logx"
)
func main() {
cfg := logx.Config{Level: slog.LevelInfo, Format: "monolog"}
slog.SetDefault(slog.New(
logx.LevelFilter(cfg.Level, logx.Fanout(
logx.ConsoleHandler(os.Stdout, cfg, true, "myapp"),
// ide kerülhet még handler: fájl-handler, saját sink, ...
)),
))
slog.Info("service starting", "addr", ":3000")
}
A frameworkön belül a telemetry.Setup ugyanígy építi a default loggert, csak két plusz handlerrel a fanoutban: az OTel log-bridge-dzsel és a Sentry capture handlerrel. Lásd a Telemetry: Logolás oldalt ehhez a kompozícióhoz.
Kapcsolódó oldalak
- logx: Monolog-formázó: a
[dátum] channel.SZINT: üzenetformátum, stack trace-ek azerrs-ből, és egy Laravel/Symfony-fogalommegfeleltetés. - Telemetry: Áttekintés: hogyan fanoutolja a
telemetry.Setupalogxkonzol-handlerét az OTel-bridge és a Sentry-handler mellé. - errs: Áttekintés: a hibatípus, amiből a
logx/monologa stack trace-t rendereli.