Преглед на файлове

Engine: improved logging and identification of jobs

Solomon Hykes преди 11 години
родител
ревизия
4e7cb37dcc
променени са 2 файла, в които са добавени 38 реда и са изтрити 5 реда
  1. 15 0
      engine/engine.go
  2. 23 5
      engine/job.go

+ 15 - 0
engine/engine.go

@@ -5,6 +5,7 @@ import (
 	"os"
 	"log"
 	"runtime"
+	"strings"
 	"github.com/dotcloud/docker/utils"
 )
 
@@ -33,6 +34,11 @@ type Engine struct {
 	root		string
 	handlers	map[string]Handler
 	hack		Hack	// data for temporary hackery (see hack.go)
+	id		string
+}
+
+func (eng *Engine) Root() string {
+	return eng.root
 }
 
 func (eng *Engine) Register(name string, handler Handler) error {
@@ -84,6 +90,10 @@ func New(root string) (*Engine, error) {
 	return eng, nil
 }
 
+func (eng *Engine) String() string {
+	return fmt.Sprintf("%s|%s", eng.Root(), eng.id[:8])
+}
+
 // Job creates a new job which can later be executed.
 // This function mimics `Command` from the standard os/exec package.
 func (eng *Engine) Job(name string, args ...string) *Job {
@@ -102,3 +112,8 @@ func (eng *Engine) Job(name string, args ...string) *Job {
 	return job
 }
 
+
+func (eng *Engine) Logf(format string, args ...interface{}) (n int, err error) {
+	prefixedFormat := fmt.Sprintf("[%s] %s\n", eng, strings.TrimRight(format, "\n"))
+	return fmt.Printf(prefixedFormat, args...)
+}

+ 23 - 5
engine/job.go

@@ -6,7 +6,6 @@ import (
 	"strings"
 	"fmt"
 	"encoding/json"
-	"github.com/dotcloud/docker/utils"
 )
 
 // A job is the fundamental unit of work in the docker engine.
@@ -38,9 +37,10 @@ type Job struct {
 // If the job returns a failure status, an error is returned
 // which includes the status.
 func (job *Job) Run() error {
-	randId := utils.RandomString()[:4]
-	fmt.Printf("Job #%s: %s\n", randId, job)
-	defer fmt.Printf("Job #%s: %s = '%s'", randId, job, job.status)
+	job.Logf("{")
+	defer func() {
+		job.Logf("}")
+	}()
 	if job.handler == nil {
 		job.status = "command not found"
 	} else {
@@ -54,7 +54,20 @@ func (job *Job) Run() error {
 
 // String returns a human-readable description of `job`
 func (job *Job) String() string {
-	return strings.Join(append([]string{job.Name}, job.Args...), " ")
+	s := fmt.Sprintf("%s.%s(%s)", job.Eng, job.Name, strings.Join(job.Args, ", "))
+	// FIXME: if a job returns the empty string, it will be printed
+	// as not having returned.
+	// (this only affects String which is a convenience function).
+	if job.status != "" {
+		var okerr string
+		if job.status == "0" {
+			okerr = "OK"
+		} else {
+			okerr = "ERR"
+		}
+		s = fmt.Sprintf("%s = %s (%s)", s, okerr, job.status)
+	}
+	return s
 }
 
 func (job *Job) Getenv(key string) (value string) {
@@ -169,3 +182,8 @@ func (job *Job) Environ() map[string]string {
 	}
 	return m
 }
+
+func (job *Job) Logf(format string, args ...interface{}) (n int, err error) {
+	prefixedFormat := fmt.Sprintf("[%s] %s\n", job, strings.TrimRight(format, "\n"))
+	return fmt.Fprintf(job.Stdout, prefixedFormat, args...)
+}