Victor Vieux 12 vuotta sitten
vanhempi
commit
941e3e2ef0
3 muutettua tiedostoa jossa 53 lisäystä ja 23 poistoa
  1. 13 5
      container.go
  2. 2 2
      runtime.go
  3. 38 16
      utils/utils.go

+ 13 - 5
container.go

@@ -617,13 +617,21 @@ func (container *Container) Start(hostConfig *HostConfig) error {
 	container.cmd = exec.Command("lxc-start", params...)
 
 	// Setup logging of stdout and stderr to disk
-	if err := container.runtime.LogToDisk(container.stdout, container.logPath("stdout")); err != nil {
+	/*
+	if err := container.runtime.LogToDisk(container.stdout, container.logPath("stdout"), ""); err != nil {
 		return err
 	}
-	if err := container.runtime.LogToDisk(container.stderr, container.logPath("stderr")); err != nil {
+	if err := container.runtime.LogToDisk(container.stderr, container.logPath("stderr"), ""); err != nil {
 		return err
 	}
-
+	*/
+	if err := container.runtime.LogToDisk(container.stdout, container.logPath("json"), "stdout"); err != nil {
+		return err
+	}
+	if err := container.runtime.LogToDisk(container.stderr, container.logPath("json"), "stderr"); err != nil {
+		return err
+	}
+	
 	var err error
 	if container.Config.Tty {
 		err = container.startPty()
@@ -678,13 +686,13 @@ func (container *Container) StdinPipe() (io.WriteCloser, error) {
 
 func (container *Container) StdoutPipe() (io.ReadCloser, error) {
 	reader, writer := io.Pipe()
-	container.stdout.AddWriter(writer)
+	container.stdout.AddWriter(writer, "")
 	return utils.NewBufReader(reader), nil
 }
 
 func (container *Container) StderrPipe() (io.ReadCloser, error) {
 	reader, writer := io.Pipe()
-	container.stderr.AddWriter(writer)
+	container.stderr.AddWriter(writer, "")
 	return utils.NewBufReader(reader), nil
 }
 

+ 2 - 2
runtime.go

@@ -168,12 +168,12 @@ func (runtime *Runtime) Register(container *Container) error {
 	return nil
 }
 
-func (runtime *Runtime) LogToDisk(src *utils.WriteBroadcaster, dst string) error {
+func (runtime *Runtime) LogToDisk(src *utils.WriteBroadcaster, dst, stream string) error {
 	log, err := os.OpenFile(dst, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0600)
 	if err != nil {
 		return err
 	}
-	src.AddWriter(log)
+	src.AddWriter(log, stream)
 	return nil
 }
 

+ 38 - 16
utils/utils.go

@@ -247,30 +247,52 @@ func (r *bufReader) Close() error {
 
 type WriteBroadcaster struct {
 	sync.Mutex
-	writers map[io.WriteCloser]struct{}
+	writers map[StreamWriter][]byte
 }
 
-func (w *WriteBroadcaster) AddWriter(writer io.WriteCloser) {
-	w.Lock()
-	w.writers[writer] = struct{}{}
-	w.Unlock()
+type StreamWriter struct {
+	wc io.WriteCloser
+	stream string
 }
 
-// FIXME: Is that function used?
-// FIXME: This relies on the concrete writer type used having equality operator
-func (w *WriteBroadcaster) RemoveWriter(writer io.WriteCloser) {
+func (w *WriteBroadcaster) AddWriter(writer io.WriteCloser, stream string) {
 	w.Lock()
-	delete(w.writers, writer)
+	sw := StreamWriter{wc: writer, stream: stream}
+	w.writers[sw] = []byte{}
 	w.Unlock()
 }
 
+type JSONLog struct {
+	Log   string `json:"log,omitempty"`
+	Stream string `json:"stream,omitempty"`
+	Created time.Time `json:"time"`
+}
+
 func (w *WriteBroadcaster) Write(p []byte) (n int, err error) {
 	w.Lock()
 	defer w.Unlock()
-	for writer := range w.writers {
-		if n, err := writer.Write(p); err != nil || n != len(p) {
+	for sw := range w.writers {
+		lp := p
+		if sw.stream != "" {
+			w.writers[sw] = append(w.writers[sw], p...)
+			s := string(p)
+			if s[len(s)-1] == '\n' {
+			/*	lp, err = json.Marshal(&JSONLog{Log: s, Stream: sw.stream, Created: time.Now()})
+				if err != nil {
+					// On error, evict the writer
+					delete(w.writers, sw)
+					continue
+				}
+			*/
+				lp = []byte("[" + time.Now().String() + "] [" + sw.stream + "] " + s)
+				w.writers[sw] = []byte{}
+			} else {
+				continue
+			}
+		}
+		if n, err := sw.wc.Write(lp); err != nil || n != len(lp) {
 			// On error, evict the writer
-			delete(w.writers, writer)
+			delete(w.writers, sw)
 		}
 	}
 	return len(p), nil
@@ -279,15 +301,15 @@ func (w *WriteBroadcaster) Write(p []byte) (n int, err error) {
 func (w *WriteBroadcaster) CloseWriters() error {
 	w.Lock()
 	defer w.Unlock()
-	for writer := range w.writers {
-		writer.Close()
+	for sw := range w.writers {
+		sw.wc.Close()
 	}
-	w.writers = make(map[io.WriteCloser]struct{})
+	w.writers = make(map[StreamWriter][]byte)
 	return nil
 }
 
 func NewWriteBroadcaster() *WriteBroadcaster {
-	return &WriteBroadcaster{writers: make(map[io.WriteCloser]struct{})}
+	return &WriteBroadcaster{writers: make(map[StreamWriter][]byte)}
 }
 
 func GetTotalUsedFds() int {