debug.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package stream
  2. import (
  3. "io"
  4. "sync/atomic"
  5. "github.com/rs/zerolog"
  6. )
  7. // DebugStream will tee each read and write to the output logger as a debug message
  8. type DebugStream struct {
  9. reader io.Reader
  10. writer io.Writer
  11. log *zerolog.Logger
  12. max uint64
  13. count atomic.Uint64
  14. }
  15. func NewDebugStream(stream io.ReadWriter, logger *zerolog.Logger, max uint64) *DebugStream {
  16. return &DebugStream{
  17. reader: stream,
  18. writer: stream,
  19. log: logger,
  20. max: max,
  21. }
  22. }
  23. func (d *DebugStream) Read(p []byte) (n int, err error) {
  24. n, err = d.reader.Read(p)
  25. if n > 0 && d.max > d.count.Load() {
  26. d.count.Add(1)
  27. if err != nil {
  28. d.log.Err(err).
  29. Str("dir", "r").
  30. Int("count", n).
  31. Msgf("%+q", p[:n])
  32. } else {
  33. d.log.Debug().
  34. Str("dir", "r").
  35. Int("count", n).
  36. Msgf("%+q", p[:n])
  37. }
  38. }
  39. return
  40. }
  41. func (d *DebugStream) Write(p []byte) (n int, err error) {
  42. n, err = d.writer.Write(p)
  43. if n > 0 && d.max > d.count.Load() {
  44. d.count.Add(1)
  45. if err != nil {
  46. d.log.Err(err).
  47. Str("dir", "w").
  48. Int("count", n).
  49. Msgf("%+q", p[:n])
  50. } else {
  51. d.log.Debug().
  52. Str("dir", "w").
  53. Int("count", n).
  54. Msgf("%+q", p[:n])
  55. }
  56. }
  57. return
  58. }