jsonlog.go 986 B

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