jsonfilelog.go 1.3 KB

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