Skip to content

Commit

Permalink
feat: add ability to specify labels for all loggers
Browse files Browse the repository at this point in the history
  • Loading branch information
lanzafame committed Feb 25, 2021
1 parent 4f34608 commit 509684e
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 1 deletion.
21 changes: 21 additions & 0 deletions setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ const (
envLoggingURL = "GOLOG_URL" // url that will be processed by sink in the zap

envLoggingOutput = "GOLOG_OUTPUT" // possible values: stdout|stderr|file combine multiple values with '+'
envLoggingLabels = "GOLOG_LOG_LABELS" // comma-separated key-value pairs, i.e. "app,example_app,dc,sjc-1"
)

type LogFormat int
Expand Down Expand Up @@ -61,6 +62,9 @@ type Config struct {

// URL with schema supported by zap. Use zap.RegisterSink
URL string

// Labels is a set of key-values to apply to all loggers
Labels []string
}

// ErrNoSuchLogger is returned when the util pkg is asked for a non existant logger
Expand Down Expand Up @@ -122,6 +126,13 @@ func SetupLogging(cfg Config) {
}

newPrimaryCore := newCore(primaryFormat, ws, LevelDebug) // the main core needs to log everything.

if len(cfg.Labels) > 0 {
for i := 0; i < len(cfg.Labels); i=i+2 {
newPrimaryCore = newPrimaryCore.With([]zap.Field{zap.String(cfg.Labels[i], cfg.Labels[i+1])})
}
}

if primaryCore != nil {
loggerCore.ReplaceCore(primaryCore, newPrimaryCore)
} else {
Expand Down Expand Up @@ -293,5 +304,15 @@ func configFromEnv() Config {
}
}

labels := os.Getenv(envLoggingLabels)
if labels != "" {
labelKVs := strings.Split(labels, ",")
if len(labelKVs)%2 != 0 {
fmt.Fprint(os.Stderr, "odd number of args for GOLOG_LOG_LABELS; please specify complete key-value pairs")
} else {
cfg.Labels = labelKVs
}
}

return cfg
}
34 changes: 33 additions & 1 deletion setup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,36 @@ func TestLogToFile(t *testing.T) {
t.Logf("want: '%s', got: '%s'", want, string(content))
t.Fail()
}
}
}

func TestLogLabels(t *testing.T) {
r, w, err := os.Pipe()
if err != nil {
t.Fatalf("failed to open pipe: %v", err)
}

stderr := os.Stderr
os.Stderr = w
defer func() {
os.Stderr = stderr
}()

// set the go-log labels env var
os.Setenv(envLoggingLabels, "app,example_app,dc,sjc-1")
SetupLogging(configFromEnv())

log := getLogger("test")

log.Error("scooby")
w.Close()

buf := &bytes.Buffer{}
if _, err := io.Copy(buf, r); err != nil && err != io.ErrClosedPipe {
t.Fatalf("unexpected error: %v", err)
}

t.Log(buf.String())
if !strings.Contains(buf.String(), "{\"app\": \"example_app\", \"dc\": \"sjc-1\"}") {
t.Errorf("got %q, wanted it to contain log output", buf.String())
}
}

0 comments on commit 509684e

Please sign in to comment.