Browse code

Engine: improved logging and identification of jobs

Solomon Hykes authored on 2013/10/27 16:01:15
Showing 2 changed files
... ...
@@ -5,6 +5,7 @@ import (
5 5
 	"os"
6 6
 	"log"
7 7
 	"runtime"
8
+	"strings"
8 9
 	"github.com/dotcloud/docker/utils"
9 10
 )
10 11
 
... ...
@@ -33,6 +34,11 @@ type Engine struct {
33 33
 	root		string
34 34
 	handlers	map[string]Handler
35 35
 	hack		Hack	// data for temporary hackery (see hack.go)
36
+	id		string
37
+}
38
+
39
+func (eng *Engine) Root() string {
40
+	return eng.root
36 41
 }
37 42
 
38 43
 func (eng *Engine) Register(name string, handler Handler) error {
... ...
@@ -84,6 +90,10 @@ func New(root string) (*Engine, error) {
84 84
 	return eng, nil
85 85
 }
86 86
 
87
+func (eng *Engine) String() string {
88
+	return fmt.Sprintf("%s|%s", eng.Root(), eng.id[:8])
89
+}
90
+
87 91
 // Job creates a new job which can later be executed.
88 92
 // This function mimics `Command` from the standard os/exec package.
89 93
 func (eng *Engine) Job(name string, args ...string) *Job {
... ...
@@ -102,3 +112,8 @@ func (eng *Engine) Job(name string, args ...string) *Job {
102 102
 	return job
103 103
 }
104 104
 
105
+
106
+func (eng *Engine) Logf(format string, args ...interface{}) (n int, err error) {
107
+	prefixedFormat := fmt.Sprintf("[%s] %s\n", eng, strings.TrimRight(format, "\n"))
108
+	return fmt.Printf(prefixedFormat, args...)
109
+}
... ...
@@ -6,7 +6,6 @@ import (
6 6
 	"strings"
7 7
 	"fmt"
8 8
 	"encoding/json"
9
-	"github.com/dotcloud/docker/utils"
10 9
 )
11 10
 
12 11
 // A job is the fundamental unit of work in the docker engine.
... ...
@@ -38,9 +37,10 @@ type Job struct {
38 38
 // If the job returns a failure status, an error is returned
39 39
 // which includes the status.
40 40
 func (job *Job) Run() error {
41
-	randId := utils.RandomString()[:4]
42
-	fmt.Printf("Job #%s: %s\n", randId, job)
43
-	defer fmt.Printf("Job #%s: %s = '%s'", randId, job, job.status)
41
+	job.Logf("{")
42
+	defer func() {
43
+		job.Logf("}")
44
+	}()
44 45
 	if job.handler == nil {
45 46
 		job.status = "command not found"
46 47
 	} else {
... ...
@@ -54,7 +54,20 @@ func (job *Job) Run() error {
54 54
 
55 55
 // String returns a human-readable description of `job`
56 56
 func (job *Job) String() string {
57
-	return strings.Join(append([]string{job.Name}, job.Args...), " ")
57
+	s := fmt.Sprintf("%s.%s(%s)", job.Eng, job.Name, strings.Join(job.Args, ", "))
58
+	// FIXME: if a job returns the empty string, it will be printed
59
+	// as not having returned.
60
+	// (this only affects String which is a convenience function).
61
+	if job.status != "" {
62
+		var okerr string
63
+		if job.status == "0" {
64
+			okerr = "OK"
65
+		} else {
66
+			okerr = "ERR"
67
+		}
68
+		s = fmt.Sprintf("%s = %s (%s)", s, okerr, job.status)
69
+	}
70
+	return s
58 71
 }
59 72
 
60 73
 func (job *Job) Getenv(key string) (value string) {
... ...
@@ -169,3 +182,8 @@ func (job *Job) Environ() map[string]string {
169 169
 	}
170 170
 	return m
171 171
 }
172
+
173
+func (job *Job) Logf(format string, args ...interface{}) (n int, err error) {
174
+	prefixedFormat := fmt.Sprintf("[%s] %s\n", job, strings.TrimRight(format, "\n"))
175
+	return fmt.Fprintf(job.Stdout, prefixedFormat, args...)
176
+}