read.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package jsonfilelog // import "github.com/docker/docker/daemon/logger/jsonfilelog"
  2. import (
  3. "context"
  4. "encoding/json"
  5. "io"
  6. "github.com/docker/docker/api/types/backend"
  7. "github.com/docker/docker/daemon/logger"
  8. "github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog"
  9. "github.com/docker/docker/daemon/logger/loggerutils"
  10. "github.com/docker/docker/pkg/tailfile"
  11. )
  12. // ReadLogs implements the logger's LogReader interface for the logs
  13. // created by this driver.
  14. func (l *JSONFileLogger) ReadLogs(config logger.ReadConfig) *logger.LogWatcher {
  15. return l.writer.ReadLogs(config)
  16. }
  17. func decodeLogLine(dec *json.Decoder, l *jsonlog.JSONLog) (*logger.Message, error) {
  18. l.Reset()
  19. if err := dec.Decode(l); err != nil {
  20. return nil, err
  21. }
  22. var attrs []backend.LogAttr
  23. if len(l.Attrs) != 0 {
  24. attrs = make([]backend.LogAttr, 0, len(l.Attrs))
  25. for k, v := range l.Attrs {
  26. attrs = append(attrs, backend.LogAttr{Key: k, Value: v})
  27. }
  28. }
  29. msg := &logger.Message{
  30. Source: l.Stream,
  31. Timestamp: l.Created,
  32. Line: []byte(l.Log),
  33. Attrs: attrs,
  34. }
  35. return msg, nil
  36. }
  37. type decoder struct {
  38. rdr io.Reader
  39. dec *json.Decoder
  40. jl *jsonlog.JSONLog
  41. }
  42. func (d *decoder) Reset(rdr io.Reader) {
  43. d.rdr = rdr
  44. d.dec = nil
  45. if d.jl != nil {
  46. d.jl.Reset()
  47. }
  48. }
  49. func (d *decoder) Close() {
  50. d.dec = nil
  51. d.rdr = nil
  52. d.jl = nil
  53. }
  54. func (d *decoder) Decode() (msg *logger.Message, err error) {
  55. if d.dec == nil {
  56. d.dec = json.NewDecoder(d.rdr)
  57. }
  58. if d.jl == nil {
  59. d.jl = &jsonlog.JSONLog{}
  60. }
  61. return decodeLogLine(d.dec, d.jl)
  62. }
  63. // decodeFunc is used to create a decoder for the log file reader
  64. func decodeFunc(rdr io.Reader) loggerutils.Decoder {
  65. return &decoder{
  66. rdr: rdr,
  67. dec: nil,
  68. jl: nil,
  69. }
  70. }
  71. func getTailReader(ctx context.Context, r loggerutils.SizeReaderAt, req int) (io.Reader, int, error) {
  72. return tailfile.NewTailReader(ctx, r, req)
  73. }