Commit ea955b1a authored by lanzafame's avatar lanzafame

enable configuring several log outputs

parent f8d20c39
......@@ -29,6 +29,7 @@ const (
envLoggingFmt = "GOLOG_LOG_FMT"
envLoggingFile = "GOLOG_FILE" // /path/to/file
envLoggingOutput = "GOLOG_OUTPUT" // possible values: stdout|stderr|file combine multiple values with '+'
)
type LogFormat int
......@@ -263,5 +264,50 @@ func configFromEnv() Config {
cfg.Stderr = false
}
output := os.Getenv(envLoggingOutput)
//TODO: fix lanzafame's super lazy impl...
switch output {
case "stdout":
cfg.Stdout = true
cfg.Stderr = false
cfg.File = ""
case "stderr":
cfg.Stderr = true
cfg.Stdout = false
cfg.File = ""
case "file":
cfg.File = os.Getenv(envLoggingFile)
if cfg.File != "" {
fmt.Fprint(os.Stderr, "please specify a GOLOG_FILE value to write to")
}
cfg.Stderr = false
cfg.Stdout = false
case "stdout+file", "file+stdout":
cfg.File = os.Getenv(envLoggingFile)
if cfg.File != "" {
fmt.Fprint(os.Stderr, "please specify a GOLOG_FILE value to write to")
}
cfg.Stderr = false
cfg.Stdout = true
case "stderr+file", "file+stderr":
cfg.File = os.Getenv(envLoggingFile)
if cfg.File != "" {
fmt.Fprint(os.Stderr, "please specify a GOLOG_FILE value to write to")
}
cfg.Stderr = true
cfg.Stdout = false
case "stdout+stderr", "stderr+stdout":
cfg.File = ""
cfg.Stderr = true
cfg.Stdout = true
case "stdout+stderr+file", "stdout+file+stderr", "stderr+stdout+file", "stderr+file+stdout", "file+stdout+stderr", "file+stderr+stdout":
cfg.File = os.Getenv(envLoggingFile)
if cfg.File != "" {
fmt.Fprint(os.Stderr, "please specify a GOLOG_FILE value to write to")
}
cfg.Stderr = true
cfg.Stdout = true
}
return cfg
}
......@@ -3,6 +3,7 @@ package log
import (
"bytes"
"io"
"io/ioutil"
"os"
"strings"
"testing"
......@@ -37,3 +38,87 @@ func TestGetLoggerDefault(t *testing.T) {
}
}
func TestLogToFileAndStderr(t *testing.T) {
// setup stderr
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
}()
// setup file
logfile, err := ioutil.TempFile("", "go-log-test")
if err != nil {
t.Fatal(err)
}
defer os.Remove(logfile.Name())
os.Setenv(envLoggingFile, logfile.Name())
// set log output env var
os.Setenv(envLoggingOutput, "file+stderr")
SetupLogging(configFromEnv())
log := getLogger("test")
want := "scooby"
log.Error(want)
w.Close()
buf := &bytes.Buffer{}
if _, err := io.Copy(buf, r); err != nil && err != io.ErrClosedPipe {
t.Fatalf("unexpected error: %v", err)
}
if !strings.Contains(buf.String(), want) {
t.Errorf("got %q, wanted it to contain log output", buf.String())
}
content, err := ioutil.ReadFile(logfile.Name())
if err != nil {
t.Fatal(err)
}
if !strings.Contains(string(content), want) {
t.Logf("want: '%s', got: '%s'", want, string(content))
t.Fail()
}
}
func TestLogToFile(t *testing.T) {
// get tmp log file
logfile, err := ioutil.TempFile("", "go-log-test")
if err != nil {
t.Fatal(err)
}
defer os.Remove(logfile.Name())
// set the go-log file env var
os.Setenv(envLoggingFile, logfile.Name())
SetupLogging(configFromEnv())
log := getLogger("test")
// write log to file
want := "grokgrokgrok"
log.Error(want)
// read log file and check contents
content, err := ioutil.ReadFile(logfile.Name())
if err != nil {
t.Fatal(err)
}
if !strings.Contains(string(content), want) {
t.Logf("want: '%s', got: '%s'", want, string(content))
t.Fail()
}
}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment