Browse code

Move "logs" to daemon/logs.go

This is part of an effort to break apart the deprecated server/ package

Docker-DCO-1.1-Signed-off-by: Solomon Hykes <solomon@docker.com> (github: shykes)

Solomon Hykes authored on 2014/08/01 06:03:21
Showing 4 changed files
... ...
@@ -144,6 +144,9 @@ func (daemon *Daemon) Install(eng *engine.Engine) error {
144 144
 	if err := eng.Register("commit", daemon.ContainerCommit); err != nil {
145 145
 		return err
146 146
 	}
147
+	if err := eng.Register("logs", daemon.ContainerLogs); err != nil {
148
+		return err
149
+	}
147 150
 	return nil
148 151
 }
149 152
 
150 153
new file mode 100644
... ...
@@ -0,0 +1,133 @@
0
+package daemon
1
+
2
+import (
3
+	"bytes"
4
+	"encoding/json"
5
+	"fmt"
6
+	"io"
7
+	"os"
8
+	"strconv"
9
+	"time"
10
+
11
+	"github.com/docker/docker/pkg/tailfile"
12
+
13
+	"github.com/docker/docker/engine"
14
+	"github.com/docker/docker/utils"
15
+)
16
+
17
+func (daemon *Daemon) ContainerLogs(job *engine.Job) engine.Status {
18
+	if len(job.Args) != 1 {
19
+		return job.Errorf("Usage: %s CONTAINER\n", job.Name)
20
+	}
21
+
22
+	var (
23
+		name   = job.Args[0]
24
+		stdout = job.GetenvBool("stdout")
25
+		stderr = job.GetenvBool("stderr")
26
+		tail   = job.Getenv("tail")
27
+		follow = job.GetenvBool("follow")
28
+		times  = job.GetenvBool("timestamps")
29
+		lines  = -1
30
+		format string
31
+	)
32
+	if !(stdout || stderr) {
33
+		return job.Errorf("You must choose at least one stream")
34
+	}
35
+	if times {
36
+		format = time.RFC3339Nano
37
+	}
38
+	if tail == "" {
39
+		tail = "all"
40
+	}
41
+	container := daemon.Get(name)
42
+	if container == nil {
43
+		return job.Errorf("No such container: %s", name)
44
+	}
45
+	cLog, err := container.ReadLog("json")
46
+	if err != nil && os.IsNotExist(err) {
47
+		// Legacy logs
48
+		utils.Debugf("Old logs format")
49
+		if stdout {
50
+			cLog, err := container.ReadLog("stdout")
51
+			if err != nil {
52
+				utils.Errorf("Error reading logs (stdout): %s", err)
53
+			} else if _, err := io.Copy(job.Stdout, cLog); err != nil {
54
+				utils.Errorf("Error streaming logs (stdout): %s", err)
55
+			}
56
+		}
57
+		if stderr {
58
+			cLog, err := container.ReadLog("stderr")
59
+			if err != nil {
60
+				utils.Errorf("Error reading logs (stderr): %s", err)
61
+			} else if _, err := io.Copy(job.Stderr, cLog); err != nil {
62
+				utils.Errorf("Error streaming logs (stderr): %s", err)
63
+			}
64
+		}
65
+	} else if err != nil {
66
+		utils.Errorf("Error reading logs (json): %s", err)
67
+	} else {
68
+		if tail != "all" {
69
+			var err error
70
+			lines, err = strconv.Atoi(tail)
71
+			if err != nil {
72
+				utils.Errorf("Failed to parse tail %s, error: %v, show all logs", err)
73
+				lines = -1
74
+			}
75
+		}
76
+		if lines != 0 {
77
+			if lines > 0 {
78
+				f := cLog.(*os.File)
79
+				ls, err := tailfile.TailFile(f, lines)
80
+				if err != nil {
81
+					return job.Error(err)
82
+				}
83
+				tmp := bytes.NewBuffer([]byte{})
84
+				for _, l := range ls {
85
+					fmt.Fprintf(tmp, "%s\n", l)
86
+				}
87
+				cLog = tmp
88
+			}
89
+			dec := json.NewDecoder(cLog)
90
+			for {
91
+				l := &utils.JSONLog{}
92
+
93
+				if err := dec.Decode(l); err == io.EOF {
94
+					break
95
+				} else if err != nil {
96
+					utils.Errorf("Error streaming logs: %s", err)
97
+					break
98
+				}
99
+				logLine := l.Log
100
+				if times {
101
+					logLine = fmt.Sprintf("%s %s", l.Created.Format(format), logLine)
102
+				}
103
+				if l.Stream == "stdout" && stdout {
104
+					fmt.Fprintf(job.Stdout, "%s", logLine)
105
+				}
106
+				if l.Stream == "stderr" && stderr {
107
+					fmt.Fprintf(job.Stderr, "%s", logLine)
108
+				}
109
+			}
110
+		}
111
+	}
112
+	if follow {
113
+		errors := make(chan error, 2)
114
+		if stdout {
115
+			stdoutPipe := container.StdoutLogPipe()
116
+			go func() {
117
+				errors <- utils.WriteLog(stdoutPipe, job.Stdout, format)
118
+			}()
119
+		}
120
+		if stderr {
121
+			stderrPipe := container.StderrLogPipe()
122
+			go func() {
123
+				errors <- utils.WriteLog(stderrPipe, job.Stderr, format)
124
+			}()
125
+		}
126
+		err := <-errors
127
+		if err != nil {
128
+			utils.Errorf("%s", err)
129
+		}
130
+	}
131
+	return engine.StatusOK
132
+}
... ...
@@ -5,8 +5,6 @@
5 5
 package server
6 6
 
7 7
 import (
8
-	"bytes"
9
-	"encoding/json"
10 8
 	"errors"
11 9
 	"fmt"
12 10
 	"io"
... ...
@@ -17,13 +15,10 @@ import (
17 17
 	"path/filepath"
18 18
 	"strconv"
19 19
 	"strings"
20
-	"time"
21 20
 
22 21
 	"github.com/docker/docker/daemon"
23 22
 	"github.com/docker/docker/engine"
24 23
 	"github.com/docker/docker/pkg/graphdb"
25
-	"github.com/docker/docker/pkg/tailfile"
26
-	"github.com/docker/docker/utils"
27 24
 )
28 25
 
29 26
 func (srv *Server) ContainerTop(job *engine.Job) engine.Status {
... ...
@@ -353,123 +348,6 @@ func (srv *Server) ContainerDestroy(job *engine.Job) engine.Status {
353 353
 	return engine.StatusOK
354 354
 }
355 355
 
356
-func (srv *Server) ContainerLogs(job *engine.Job) engine.Status {
357
-	if len(job.Args) != 1 {
358
-		return job.Errorf("Usage: %s CONTAINER\n", job.Name)
359
-	}
360
-
361
-	var (
362
-		name   = job.Args[0]
363
-		stdout = job.GetenvBool("stdout")
364
-		stderr = job.GetenvBool("stderr")
365
-		tail   = job.Getenv("tail")
366
-		follow = job.GetenvBool("follow")
367
-		times  = job.GetenvBool("timestamps")
368
-		lines  = -1
369
-		format string
370
-	)
371
-	if !(stdout || stderr) {
372
-		return job.Errorf("You must choose at least one stream")
373
-	}
374
-	if times {
375
-		format = time.RFC3339Nano
376
-	}
377
-	if tail == "" {
378
-		tail = "all"
379
-	}
380
-	container := srv.daemon.Get(name)
381
-	if container == nil {
382
-		return job.Errorf("No such container: %s", name)
383
-	}
384
-	cLog, err := container.ReadLog("json")
385
-	if err != nil && os.IsNotExist(err) {
386
-		// Legacy logs
387
-		utils.Debugf("Old logs format")
388
-		if stdout {
389
-			cLog, err := container.ReadLog("stdout")
390
-			if err != nil {
391
-				utils.Errorf("Error reading logs (stdout): %s", err)
392
-			} else if _, err := io.Copy(job.Stdout, cLog); err != nil {
393
-				utils.Errorf("Error streaming logs (stdout): %s", err)
394
-			}
395
-		}
396
-		if stderr {
397
-			cLog, err := container.ReadLog("stderr")
398
-			if err != nil {
399
-				utils.Errorf("Error reading logs (stderr): %s", err)
400
-			} else if _, err := io.Copy(job.Stderr, cLog); err != nil {
401
-				utils.Errorf("Error streaming logs (stderr): %s", err)
402
-			}
403
-		}
404
-	} else if err != nil {
405
-		utils.Errorf("Error reading logs (json): %s", err)
406
-	} else {
407
-		if tail != "all" {
408
-			var err error
409
-			lines, err = strconv.Atoi(tail)
410
-			if err != nil {
411
-				utils.Errorf("Failed to parse tail %s, error: %v, show all logs", err)
412
-				lines = -1
413
-			}
414
-		}
415
-		if lines != 0 {
416
-			if lines > 0 {
417
-				f := cLog.(*os.File)
418
-				ls, err := tailfile.TailFile(f, lines)
419
-				if err != nil {
420
-					return job.Error(err)
421
-				}
422
-				tmp := bytes.NewBuffer([]byte{})
423
-				for _, l := range ls {
424
-					fmt.Fprintf(tmp, "%s\n", l)
425
-				}
426
-				cLog = tmp
427
-			}
428
-			dec := json.NewDecoder(cLog)
429
-			for {
430
-				l := &utils.JSONLog{}
431
-
432
-				if err := dec.Decode(l); err == io.EOF {
433
-					break
434
-				} else if err != nil {
435
-					utils.Errorf("Error streaming logs: %s", err)
436
-					break
437
-				}
438
-				logLine := l.Log
439
-				if times {
440
-					logLine = fmt.Sprintf("%s %s", l.Created.Format(format), logLine)
441
-				}
442
-				if l.Stream == "stdout" && stdout {
443
-					fmt.Fprintf(job.Stdout, "%s", logLine)
444
-				}
445
-				if l.Stream == "stderr" && stderr {
446
-					fmt.Fprintf(job.Stderr, "%s", logLine)
447
-				}
448
-			}
449
-		}
450
-	}
451
-	if follow {
452
-		errors := make(chan error, 2)
453
-		if stdout {
454
-			stdoutPipe := container.StdoutLogPipe()
455
-			go func() {
456
-				errors <- utils.WriteLog(stdoutPipe, job.Stdout, format)
457
-			}()
458
-		}
459
-		if stderr {
460
-			stderrPipe := container.StderrLogPipe()
461
-			go func() {
462
-				errors <- utils.WriteLog(stderrPipe, job.Stderr, format)
463
-			}()
464
-		}
465
-		err := <-errors
466
-		if err != nil {
467
-			utils.Errorf("%s", err)
468
-		}
469
-	}
470
-	return engine.StatusOK
471
-}
472
-
473 356
 func (srv *Server) ContainerCopy(job *engine.Job) engine.Status {
474 357
 	if len(job.Args) != 2 {
475 358
 		return job.Errorf("Usage: %s CONTAINER RESOURCE\n", job.Name)
... ...
@@ -95,7 +95,6 @@ func InitServer(job *engine.Job) engine.Status {
95 95
 		"viz":              srv.ImagesViz,
96 96
 		"container_copy":   srv.ContainerCopy,
97 97
 		"log":              srv.Log,
98
-		"logs":             srv.ContainerLogs,
99 98
 		"changes":          srv.ContainerChanges,
100 99
 		"top":              srv.ContainerTop,
101 100
 		"load":             srv.ImageLoad,