Sync and async sinks, redaction, and a queryable HTTP service keep concurrent logs tied to a trace id. Co-authored-by: Cursor <cursoragent@cursor.com>
83 lines
1.9 KiB
Go
83 lines
1.9 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"logging-system/logsys"
|
|
"logging-system/sink"
|
|
)
|
|
|
|
func TestLoadEnvOverridesFile(t *testing.T) {
|
|
dir := t.TempDir()
|
|
path := filepath.Join(dir, "log.json")
|
|
raw := []byte(`{
|
|
"service": "from-file",
|
|
"level": "debug",
|
|
"modules": {"engine": "trace"},
|
|
"redaction": {"enabled": true},
|
|
"sinks": [{"type": "console", "format": "json", "level": "warn"}]
|
|
}`)
|
|
if err := os.WriteFile(path, raw, 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Setenv("LOGSYS_LEVEL", "error")
|
|
t.Setenv("LOGSYS_SERVICE", "from-env")
|
|
t.Setenv("LOGSYS_REDACT", "off")
|
|
cfg, err := Load(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if cfg.Level != "error" || cfg.Service != "from-env" || cfg.Redaction.Enabled {
|
|
t.Fatalf("%+v", cfg)
|
|
}
|
|
if cfg.Modules["engine"] != "trace" || cfg.Trace.Header != "X-Trace-Id" {
|
|
t.Fatalf("%+v", cfg)
|
|
}
|
|
log, err := Build(cfg)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
mem := &sink.Memory{}
|
|
log2 := logsys.New(logsys.Options{Service: cfg.Service, Level: logsys.LevelError, Sinks: []logsys.Sink{mem}})
|
|
log2.Info("skip")
|
|
log2.Error("keep", nil)
|
|
if len(mem.Snapshot()) != 1 {
|
|
t.Fatal(mem.Snapshot())
|
|
}
|
|
if err := log.Close(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestBuildFileSink(t *testing.T) {
|
|
dir := t.TempDir()
|
|
cfg := Defaults()
|
|
cfg.Sinks = []SinkConfig{{
|
|
Type: "file",
|
|
Path: filepath.Join(dir, "app.jsonl"),
|
|
Format: "json",
|
|
Rotation: &RotationConfig{MaxBytes: 1024, Keep: 2},
|
|
}}
|
|
log, err := Build(cfg)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
log.Info("hello", "token", "sk-abcdefghijklmnopqrstuvwxyz")
|
|
if err := log.Sync(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := log.Close(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data, err := os.ReadFile(filepath.Join(dir, "app.jsonl"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if string(data) == "" || strings.Contains(string(data), "sk-abcdefghijklmnopqrstuvwxyz") {
|
|
t.Fatalf("redaction failed: %s", data)
|
|
}
|
|
}
|