jsonfilelog.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package jsonfilelog
  2. import (
  3. "bytes"
  4. "os"
  5. "github.com/docker/docker/daemon/logger"
  6. "github.com/docker/docker/pkg/jsonlog"
  7. )
  8. // JSONFileLogger is Logger implementation for default docker logging:
  9. // JSON objects to file
  10. type JSONFileLogger struct {
  11. buf *bytes.Buffer
  12. f *os.File // store for closing
  13. }
  14. // New creates new JSONFileLogger which writes to filename
  15. func New(filename string) (logger.Logger, error) {
  16. log, err := os.OpenFile(filename, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0600)
  17. if err != nil {
  18. return nil, err
  19. }
  20. return &JSONFileLogger{
  21. f: log,
  22. buf: bytes.NewBuffer(nil),
  23. }, nil
  24. }
  25. // Log converts logger.Message to jsonlog.JSONLog and serializes it to file
  26. func (l *JSONFileLogger) Log(msg *logger.Message) error {
  27. err := (&jsonlog.JSONLog{Log: string(msg.Line) + "\n", Stream: msg.Source, Created: msg.Timestamp}).MarshalJSONBuf(l.buf)
  28. if err != nil {
  29. return err
  30. }
  31. l.buf.WriteByte('\n')
  32. _, err = l.buf.WriteTo(l.f)
  33. return err
  34. }
  35. // Close closes underlying file
  36. func (l *JSONFileLogger) Close() error {
  37. return l.f.Close()
  38. }
  39. // Name returns name of this logger
  40. func (l *JSONFileLogger) Name() string {
  41. return "JSONFile"
  42. }