mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	Add --log-level support
Next steps, in another PR, would be: - make all logging go through the logrus stuff - I'd like to see if we can remove the env var stuff (like DEBUG) but we'll see Closes #5198 Signed-off-by: Doug Davis <dug@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									8682bac309
								
							
						
					
					
						commit
						2facc04673
					
				
					 10 changed files with 108 additions and 15 deletions
				
			
		| 
						 | 
					@ -60,6 +60,7 @@ func main() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if *flDebug {
 | 
						if *flDebug {
 | 
				
			||||||
		os.Setenv("DEBUG", "1")
 | 
							os.Setenv("DEBUG", "1")
 | 
				
			||||||
 | 
							log.SetLevel("debug")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if flag.NArg() < 1 {
 | 
						if flag.NArg() < 1 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -719,7 +719,6 @@ func NewDaemon(config *Config, eng *engine.Engine) (*Daemon, error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error) {
 | 
					func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error) {
 | 
				
			||||||
	// Apply configuration defaults
 | 
					 | 
				
			||||||
	if config.Mtu == 0 {
 | 
						if config.Mtu == 0 {
 | 
				
			||||||
		config.Mtu = getDefaultNetworkMtu()
 | 
							config.Mtu = getDefaultNetworkMtu()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,10 +5,10 @@ import (
 | 
				
			||||||
	"crypto/x509"
 | 
						"crypto/x509"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"log" // see gh#8745, client needs to use go log pkg
 | 
					 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						log "github.com/Sirupsen/logrus"
 | 
				
			||||||
	"github.com/docker/docker/api"
 | 
						"github.com/docker/docker/api"
 | 
				
			||||||
	"github.com/docker/docker/api/client"
 | 
						"github.com/docker/docker/api/client"
 | 
				
			||||||
	"github.com/docker/docker/dockerversion"
 | 
						"github.com/docker/docker/dockerversion"
 | 
				
			||||||
| 
						 | 
					@ -36,11 +36,23 @@ func main() {
 | 
				
			||||||
		showVersion()
 | 
							showVersion()
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if *flDebug {
 | 
					
 | 
				
			||||||
		os.Setenv("DEBUG", "1")
 | 
						if *flLogLevel != "" {
 | 
				
			||||||
 | 
							lvl, err := log.ParseLevel(*flLogLevel)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								log.Fatalf("Unable to parse logging level: %s", *flLogLevel)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							initLogging(lvl)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							initLogging(log.InfoLevel)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	initLogging(*flDebug)
 | 
						// -D, --debug, -l/--log-level=debug processing
 | 
				
			||||||
 | 
						// When/if -D is removed this block can be deleted
 | 
				
			||||||
 | 
						if *flDebug {
 | 
				
			||||||
 | 
							os.Setenv("DEBUG", "1")
 | 
				
			||||||
 | 
							initLogging(log.DebugLevel)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(flHosts) == 0 {
 | 
						if len(flHosts) == 0 {
 | 
				
			||||||
		defaultHost := os.Getenv("DOCKER_HOST")
 | 
							defaultHost := os.Getenv("DOCKER_HOST")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,7 @@ var (
 | 
				
			||||||
	flDaemon      = flag.Bool([]string{"d", "-daemon"}, false, "Enable daemon mode")
 | 
						flDaemon      = flag.Bool([]string{"d", "-daemon"}, false, "Enable daemon mode")
 | 
				
			||||||
	flDebug       = flag.Bool([]string{"D", "-debug"}, false, "Enable debug mode")
 | 
						flDebug       = flag.Bool([]string{"D", "-debug"}, false, "Enable debug mode")
 | 
				
			||||||
	flSocketGroup = flag.String([]string{"G", "-group"}, "docker", "Group to assign the unix socket specified by -H when running in daemon mode\nuse '' (the empty string) to disable setting of a group")
 | 
						flSocketGroup = flag.String([]string{"G", "-group"}, "docker", "Group to assign the unix socket specified by -H when running in daemon mode\nuse '' (the empty string) to disable setting of a group")
 | 
				
			||||||
 | 
						flLogLevel    = flag.String([]string{"l", "-log-level"}, "info", "Set the logging level")
 | 
				
			||||||
	flEnableCors  = flag.Bool([]string{"#api-enable-cors", "-api-enable-cors"}, false, "Enable CORS headers in the remote API")
 | 
						flEnableCors  = flag.Bool([]string{"#api-enable-cors", "-api-enable-cors"}, false, "Enable CORS headers in the remote API")
 | 
				
			||||||
	flTls         = flag.Bool([]string{"-tls"}, false, "Use TLS; implied by tls-verify flags")
 | 
						flTls         = flag.Bool([]string{"-tls"}, false, "Use TLS; implied by tls-verify flags")
 | 
				
			||||||
	flTlsVerify   = flag.Bool([]string{"-tlsverify"}, dockerTlsVerify, "Use TLS and verify the remote (daemon: verify client, client: verify daemon)")
 | 
						flTlsVerify   = flag.Bool([]string{"-tlsverify"}, dockerTlsVerify, "Use TLS and verify the remote (daemon: verify client, client: verify daemon)")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,11 +6,7 @@ import (
 | 
				
			||||||
	log "github.com/Sirupsen/logrus"
 | 
						log "github.com/Sirupsen/logrus"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func initLogging(debug bool) {
 | 
					func initLogging(lvl log.Level) {
 | 
				
			||||||
	log.SetOutput(os.Stderr)
 | 
						log.SetOutput(os.Stderr)
 | 
				
			||||||
	if debug {
 | 
						log.SetLevel(lvl)
 | 
				
			||||||
		log.SetLevel(log.DebugLevel)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		log.SetLevel(log.InfoLevel)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,6 +65,9 @@ unix://[/path/to/socket] to use.
 | 
				
			||||||
**--iptables**=*true*|*false*
 | 
					**--iptables**=*true*|*false*
 | 
				
			||||||
  Disable Docker's addition of iptables rules. Default is true.
 | 
					  Disable Docker's addition of iptables rules. Default is true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**-l**, **--log-level**="*debug*|*info*|*error*|*fatal*""
 | 
				
			||||||
 | 
					  Set the logging level. Default is `info`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**--mtu**=VALUE
 | 
					**--mtu**=VALUE
 | 
				
			||||||
  Set the containers network mtu. Default is `1500`.
 | 
					  Set the containers network mtu. Default is `1500`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,6 +75,8 @@ expect an integer, and they can only be specified once.
 | 
				
			||||||
      --ip-forward=true                          Enable net.ipv4.ip_forward
 | 
					      --ip-forward=true                          Enable net.ipv4.ip_forward
 | 
				
			||||||
      --ip-masq=true                             Enable IP masquerading for bridge's IP range
 | 
					      --ip-masq=true                             Enable IP masquerading for bridge's IP range
 | 
				
			||||||
      --iptables=true                            Enable Docker's addition of iptables rules
 | 
					      --iptables=true                            Enable Docker's addition of iptables rules
 | 
				
			||||||
 | 
					       -l, --log-level="info"                    Set the logging level
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      --mtu=0                                    Set the containers network MTU
 | 
					      --mtu=0                                    Set the containers network MTU
 | 
				
			||||||
                                                   if no value is provided: default to the default route MTU or 1500 if no default route is available
 | 
					                                                   if no value is provided: default to the default route MTU or 1500 if no default route is available
 | 
				
			||||||
      -p, --pidfile="/var/run/docker.pid"        Path to use for daemon PID file
 | 
					      -p, --pidfile="/var/run/docker.pid"        Path to use for daemon PID file
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@ package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/exec"
 | 
						"os/exec"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
| 
						 | 
					@ -223,3 +224,63 @@ func TestDaemonIptablesCreate(t *testing.T) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logDone("daemon - run,iptables - iptables rules for always restarted container created after daemon restart")
 | 
						logDone("daemon - run,iptables - iptables rules for always restarted container created after daemon restart")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestDaemonLoggingLevel(t *testing.T) {
 | 
				
			||||||
 | 
						d := NewDaemon(t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := d.Start("--log-level=bogus"); err == nil {
 | 
				
			||||||
 | 
							t.Fatal("Daemon should not have been able to start")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						d = NewDaemon(t)
 | 
				
			||||||
 | 
						if err := d.Start("--log-level=debug"); err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						d.Stop()
 | 
				
			||||||
 | 
						content, _ := ioutil.ReadFile(d.logFile.Name())
 | 
				
			||||||
 | 
						if !strings.Contains(string(content), `level="debug"`) {
 | 
				
			||||||
 | 
							t.Fatalf(`Missing level="debug" in log file:\n%s`, string(content))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						d = NewDaemon(t)
 | 
				
			||||||
 | 
						if err := d.Start("--log-level=fatal"); err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						d.Stop()
 | 
				
			||||||
 | 
						content, _ = ioutil.ReadFile(d.logFile.Name())
 | 
				
			||||||
 | 
						if strings.Contains(string(content), `level="debug"`) {
 | 
				
			||||||
 | 
							t.Fatalf(`Should not have level="debug" in log file:\n%s`, string(content))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						d = NewDaemon(t)
 | 
				
			||||||
 | 
						if err := d.Start("-D"); err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						d.Stop()
 | 
				
			||||||
 | 
						content, _ = ioutil.ReadFile(d.logFile.Name())
 | 
				
			||||||
 | 
						if !strings.Contains(string(content), `level="debug"`) {
 | 
				
			||||||
 | 
							t.Fatalf(`Missing level="debug" in log file using -D:\n%s`, string(content))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						d = NewDaemon(t)
 | 
				
			||||||
 | 
						if err := d.Start("--debug"); err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						d.Stop()
 | 
				
			||||||
 | 
						content, _ = ioutil.ReadFile(d.logFile.Name())
 | 
				
			||||||
 | 
						if !strings.Contains(string(content), `level="debug"`) {
 | 
				
			||||||
 | 
							t.Fatalf(`Missing level="debug" in log file using --debug:\n%s`, string(content))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						d = NewDaemon(t)
 | 
				
			||||||
 | 
						if err := d.Start("--debug", "--log-level=fatal"); err != nil {
 | 
				
			||||||
 | 
							t.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						d.Stop()
 | 
				
			||||||
 | 
						content, _ = ioutil.ReadFile(d.logFile.Name())
 | 
				
			||||||
 | 
						if !strings.Contains(string(content), `level="debug"`) {
 | 
				
			||||||
 | 
							t.Fatalf(`Missing level="debug" in log file when using both --debug and --log-level=fatal:\n%s`, string(content))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						logDone("daemon - Logging Level")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1804,7 +1804,7 @@ func TestRunWithBadDevice(t *testing.T) {
 | 
				
			||||||
	if err == nil {
 | 
						if err == nil {
 | 
				
			||||||
		t.Fatal("Run should fail with bad device")
 | 
							t.Fatal("Run should fail with bad device")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	expected := `"/etc": not a device node`
 | 
						expected := `\"/etc\": not a device node`
 | 
				
			||||||
	if !strings.Contains(out, expected) {
 | 
						if !strings.Contains(out, expected) {
 | 
				
			||||||
		t.Fatalf("Output should contain %q, actual out: %q", expected, out)
 | 
							t.Fatalf("Output should contain %q, actual out: %q", expected, out)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,7 +41,7 @@ func NewDaemon(t *testing.T) *Daemon {
 | 
				
			||||||
		t.Fatal("Please set the DEST environment variable")
 | 
							t.Fatal("Please set the DEST environment variable")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dir := filepath.Join(dest, fmt.Sprintf("daemon%d", time.Now().Unix()))
 | 
						dir := filepath.Join(dest, fmt.Sprintf("daemon%d", time.Now().UnixNano()%100000000))
 | 
				
			||||||
	daemonFolder, err := filepath.Abs(dir)
 | 
						daemonFolder, err := filepath.Abs(dir)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatalf("Could not make %q an absolute path: %v", dir, err)
 | 
							t.Fatalf("Could not make %q an absolute path: %v", dir, err)
 | 
				
			||||||
| 
						 | 
					@ -69,10 +69,23 @@ func (d *Daemon) Start(arg ...string) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	args := []string{
 | 
						args := []string{
 | 
				
			||||||
		"--host", d.sock(),
 | 
							"--host", d.sock(),
 | 
				
			||||||
		"--daemon", "--debug",
 | 
							"--daemon",
 | 
				
			||||||
		"--graph", fmt.Sprintf("%s/graph", d.folder),
 | 
							"--graph", fmt.Sprintf("%s/graph", d.folder),
 | 
				
			||||||
		"--pidfile", fmt.Sprintf("%s/docker.pid", d.folder),
 | 
							"--pidfile", fmt.Sprintf("%s/docker.pid", d.folder),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If we don't explicitly set the log-level or debug flag(-D) then
 | 
				
			||||||
 | 
						// turn on debug mode
 | 
				
			||||||
 | 
						foundIt := false
 | 
				
			||||||
 | 
						for _, a := range arg {
 | 
				
			||||||
 | 
							if strings.Contains(a, "--log-level") || strings.Contains(a, "-D") {
 | 
				
			||||||
 | 
								foundIt = true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if !foundIt {
 | 
				
			||||||
 | 
							args = append(args, "--debug")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if d.storageDriver != "" {
 | 
						if d.storageDriver != "" {
 | 
				
			||||||
		args = append(args, "--storage-driver", d.storageDriver)
 | 
							args = append(args, "--storage-driver", d.storageDriver)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -83,7 +96,7 @@ func (d *Daemon) Start(arg ...string) error {
 | 
				
			||||||
	args = append(args, arg...)
 | 
						args = append(args, arg...)
 | 
				
			||||||
	d.cmd = exec.Command(dockerBinary, args...)
 | 
						d.cmd = exec.Command(dockerBinary, args...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	d.logFile, err = os.OpenFile(filepath.Join(d.folder, "docker.log"), os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600)
 | 
						d.logFile, err = os.OpenFile(filepath.Join(d.folder, "docker.log"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		d.t.Fatalf("Could not create %s/docker.log: %v", d.folder, err)
 | 
							d.t.Fatalf("Could not create %s/docker.log: %v", d.folder, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -107,8 +120,13 @@ func (d *Daemon) Start(arg ...string) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tick := time.Tick(500 * time.Millisecond)
 | 
						tick := time.Tick(500 * time.Millisecond)
 | 
				
			||||||
	// make sure daemon is ready to receive requests
 | 
						// make sure daemon is ready to receive requests
 | 
				
			||||||
 | 
						startTime := time.Now().Unix()
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		d.t.Log("waiting for daemon to start")
 | 
							d.t.Log("waiting for daemon to start")
 | 
				
			||||||
 | 
							if time.Now().Unix()-startTime > 5 {
 | 
				
			||||||
 | 
								// After 5 seconds, give up
 | 
				
			||||||
 | 
								return errors.New("Daemon exited and never started")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		select {
 | 
							select {
 | 
				
			||||||
		case <-time.After(2 * time.Second):
 | 
							case <-time.After(2 * time.Second):
 | 
				
			||||||
			return errors.New("timeout: daemon does not respond")
 | 
								return errors.New("timeout: daemon does not respond")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue