diff --git a/cmd/traefik/traefik.go b/cmd/traefik/traefik.go index 6c5911e38f..ffb10bc7e6 100644 --- a/cmd/traefik/traefik.go +++ b/cmd/traefik/traefik.go @@ -7,6 +7,7 @@ import ( fmtlog "log" "net/http" "os" + "path/filepath" "reflect" "runtime" "strings" @@ -206,6 +207,13 @@ func run(traefikConfiguration *server.TraefikConfiguration) { } log.SetLevel(level) if len(globalConfiguration.TraefikLogsFile) > 0 { + dir := filepath.Dir(globalConfiguration.TraefikLogsFile) + + err := os.MkdirAll(dir, 0755) + if err != nil { + log.Errorf("Failed to create log path %s: %s", dir, err) + } + fi, err := os.OpenFile(globalConfiguration.TraefikLogsFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) defer func() { if err := fi.Close(); err != nil { diff --git a/middlewares/logger.go b/middlewares/logger.go index d65cbbf3f1..e2b7f5b2c9 100644 --- a/middlewares/logger.go +++ b/middlewares/logger.go @@ -7,6 +7,7 @@ import ( "net" "net/http" "os" + "path/filepath" "strconv" "strings" "sync/atomic" @@ -54,6 +55,13 @@ type logInfoResponseWriter struct { // NewLogger returns a new Logger instance. func NewLogger(file string) *Logger { if len(file) > 0 { + dir := filepath.Dir(file) + + err := os.MkdirAll(dir, 0755) + if err != nil { + log.Errorf("Failed to create log path %s: %s", dir, err) + } + fi, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Error("Error opening file", err) diff --git a/middlewares/logger_test.go b/middlewares/logger_test.go index 1632f0e49a..1a782406fc 100644 --- a/middlewares/logger_test.go +++ b/middlewares/logger_test.go @@ -7,7 +7,6 @@ import ( "net/url" "os" "path/filepath" - "runtime" "testing" shellwords "github.com/mattn/go-shellwords" @@ -18,8 +17,7 @@ type logtestResponseWriter struct{} var ( logger *Logger - logfileName = "traefikTestLogger.log" - logfilePath string + logfileNameSuffix = "/traefik/logger/test.log" helloWorld = "Hello, World" testBackendName = "http://127.0.0.1/testBackend" testFrontendName = "testFrontend" @@ -39,14 +37,21 @@ var ( ) func TestLogger(t *testing.T) { - if runtime.GOOS == "windows" { - logfilePath = filepath.Join(os.Getenv("TEMP"), logfileName) - } else { - logfilePath = filepath.Join("/tmp", logfileName) + tmp, err := ioutil.TempDir("", "testlogger") + if err != nil { + t.Fatalf("failed to create temp dir: %s", err) } + defer os.RemoveAll(tmp) + + logfilePath := filepath.Join(tmp, logfileNameSuffix) logger = NewLogger(logfilePath) - defer cleanup() + defer logger.Close() + + if _, err := os.Stat(logfilePath); os.IsNotExist(err) { + t.Fatalf("logger should create %s", logfilePath) + } + SetBackend2FrontendMap(&testBackend2FrontendMap) r := &http.Request{ @@ -86,11 +91,6 @@ func TestLogger(t *testing.T) { } } -func cleanup() { - logger.Close() - os.Remove(logfilePath) -} - func printLogdata(logdata []byte) string { return fmt.Sprintf( "\nExpected: %s\n"+