Просмотр исходного кода

Windows - fix panic and stderr

Signed-off-by: John Howard <jhoward@microsoft.com>
John Howard 8 лет назад
Родитель
Сommit
141a83b820
2 измененных файлов с 15 добавлено и 1 удалено
  1. 8 1
      cmd/dockerd/docker.go
  2. 7 0
      cmd/dockerd/service_windows.go

+ 8 - 1
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)

+ 7 - 0
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
 }