diff --git a/cmd/dockerd/docker.go b/cmd/dockerd/docker.go index 2d5e37c371..c0bc965674 100644 --- a/cmd/dockerd/docker.go +++ b/cmd/dockerd/docker.go @@ -104,7 +104,14 @@ func main() { // Set terminal emulation based on platform as required. _, stdout, stderr := term.StdStreams() - logrus.SetOutput(stderr) + + // @jhowardmsft - maybe there is a historic reason why on non-Windows, stderr is used + // here. However, on Windows it makes no sense and there is no need. + if runtime.GOOS == "windows" { + logrus.SetOutput(stdout) + } else { + logrus.SetOutput(stderr) + } cmd := newDaemonCommand() cmd.SetOutput(stdout) diff --git a/cmd/dockerd/service_windows.go b/cmd/dockerd/service_windows.go index 3d038fad79..749cc9009e 100644 --- a/cmd/dockerd/service_windows.go +++ b/cmd/dockerd/service_windows.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "io/ioutil" + "log" "os" "os/exec" "path/filepath" @@ -409,6 +410,12 @@ func initPanicFile(path string) error { return err } + // Reset os.Stderr to the panic file (so fmt.Fprintf(os.Stderr,...) actually gets redirected) + os.Stderr = os.NewFile(uintptr(panicFile.Fd()), "/dev/stderr") + + // Force threads that panic to write to stderr (the panicFile handle now), otherwise it will go into the ether + log.SetOutput(os.Stderr) + return nil }