mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
wip
This commit is contained in:
parent
5a411fa38e
commit
941e3e2ef0
3 changed files with 53 additions and 23 deletions
18
container.go
18
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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
type StreamWriter struct {
|
||||
wc io.WriteCloser
|
||||
stream string
|
||||
}
|
||||
|
||||
func (w *WriteBroadcaster) AddWriter(writer io.WriteCloser, stream string) {
|
||||
w.Lock()
|
||||
w.writers[writer] = struct{}{}
|
||||
sw := StreamWriter{wc: writer, stream: stream}
|
||||
w.writers[sw] = []byte{}
|
||||
w.Unlock()
|
||||
}
|
||||
|
||||
// FIXME: Is that function used?
|
||||
// FIXME: This relies on the concrete writer type used having equality operator
|
||||
func (w *WriteBroadcaster) RemoveWriter(writer io.WriteCloser) {
|
||||
w.Lock()
|
||||
delete(w.writers, writer)
|
||||
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 {
|
||||
|
|
Loading…
Reference in a new issue