jsonlog.go 1014 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package jsonlog
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "time"
  7. )
  8. type JSONLog struct {
  9. Log string `json:"log,omitempty"`
  10. Stream string `json:"stream,omitempty"`
  11. Created time.Time `json:"time"`
  12. }
  13. func (jl *JSONLog) Format(format string) (string, error) {
  14. if format == "" {
  15. return jl.Log, nil
  16. }
  17. if format == "json" {
  18. m, err := json.Marshal(jl)
  19. return string(m), err
  20. }
  21. return fmt.Sprintf("%s %s", jl.Created.Format(format), jl.Log), nil
  22. }
  23. func (jl *JSONLog) Reset() {
  24. jl.Log = ""
  25. jl.Stream = ""
  26. jl.Created = time.Time{}
  27. }
  28. func WriteLog(src io.Reader, dst io.Writer, format string, since time.Time) error {
  29. dec := json.NewDecoder(src)
  30. l := &JSONLog{}
  31. for {
  32. l.Reset()
  33. if err := dec.Decode(l); err != nil {
  34. if err == io.EOF {
  35. return nil
  36. }
  37. return err
  38. }
  39. if !since.IsZero() && l.Created.Before(since) {
  40. continue
  41. }
  42. line, err := l.Format(format)
  43. if err != nil {
  44. return err
  45. }
  46. if _, err := io.WriteString(dst, line); err != nil {
  47. return err
  48. }
  49. }
  50. }