stream-handler.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package log
  2. import (
  3. "fmt"
  4. "io"
  5. )
  6. type StreamHandler struct {
  7. W io.Writer
  8. Fmt ByteFormatter
  9. }
  10. func (me StreamHandler) Handle(r Record) {
  11. r.Msg = r.Skip(1)
  12. me.W.Write(me.Fmt(r))
  13. }
  14. type ByteFormatter func(Record) []byte
  15. // Formats like:
  16. // [2023-12-02 14:49:32 +1100 NIL github.com/anacrolix/dht-indexer main.go:417]
  17. //
  18. // error maintaining search db: signal received: interrupt
  19. func twoLineFormatter(msg Record) []byte {
  20. b := []byte{'['}
  21. beforeLen := len(b)
  22. b = GetDefaultTimeAppendFormatter()(b)
  23. if len(b) != beforeLen {
  24. b = append(b, ' ')
  25. }
  26. b = append(b, msg.Level.LogString()...)
  27. for _, name := range msg.Names {
  28. b = append(b, ' ')
  29. b = append(b, name...)
  30. }
  31. b = append(b, "]\n "...)
  32. b = append(b, msg.Text()...)
  33. msg.Values(func(value interface{}) (more bool) {
  34. b = append(b, ' ')
  35. if item, ok := value.(item); ok {
  36. b = fmt.Appendf(b, "%s=%s", item.key, item.value)
  37. } else {
  38. b = fmt.Append(b, value)
  39. }
  40. return true
  41. })
  42. if b[len(b)-1] != '\n' {
  43. b = append(b, '\n')
  44. }
  45. return b
  46. }
  47. // Formats like: "[2023-12-02 14:34:02 +1100 INF] prefix: text [name name import-path short-file:line]"
  48. func LineFormatter(msg Record) []byte {
  49. b := []byte{'['}
  50. beforeLen := len(b)
  51. b = GetDefaultTimeAppendFormatter()(b)
  52. if len(b) != beforeLen {
  53. b = append(b, ' ')
  54. }
  55. b = append(b, msg.Level.LogString()...)
  56. b = append(b, "] "...)
  57. b = append(b, msg.Text()...)
  58. b = append(b, " ["...)
  59. b = append(b, msg.Names[0]...)
  60. for _, name := range msg.Names[1:] {
  61. b = append(b, ' ')
  62. b = append(b, name...)
  63. }
  64. b = append(b, ']')
  65. if b[len(b)-1] != '\n' {
  66. b = append(b, '\n')
  67. }
  68. return b
  69. }