logrus_text_formatter.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package log
  2. import (
  3. "bytes"
  4. "fmt"
  5. "strings"
  6. "time"
  7. "github.com/sirupsen/logrus"
  8. )
  9. const (
  10. red = 31
  11. yellow = 33
  12. blue = 36
  13. gray = 37
  14. )
  15. var baseTimestamp time.Time
  16. func init() {
  17. baseTimestamp = time.Now()
  18. }
  19. type LogrusTextFormatter struct {
  20. DisableColors bool
  21. DisableTimestamp bool
  22. FullTimestamp bool
  23. TimestampFormat string
  24. }
  25. func (f *LogrusTextFormatter) Format(entry *logrus.Entry) ([]byte, error) {
  26. var b *bytes.Buffer
  27. if entry.Buffer != nil {
  28. b = entry.Buffer
  29. } else {
  30. b = &bytes.Buffer{}
  31. }
  32. timestampFormat := f.TimestampFormat
  33. if timestampFormat == "" {
  34. timestampFormat = "-0700 2006-01-02 15:04:05"
  35. }
  36. f.print(b, entry, timestampFormat)
  37. b.WriteByte('\n')
  38. return b.Bytes(), nil
  39. }
  40. func (f *LogrusTextFormatter) print(b *bytes.Buffer, entry *logrus.Entry, timestampFormat string) {
  41. var levelColor int
  42. switch entry.Level {
  43. case logrus.DebugLevel, logrus.TraceLevel:
  44. levelColor = gray
  45. case logrus.WarnLevel:
  46. levelColor = yellow
  47. case logrus.ErrorLevel, logrus.FatalLevel, logrus.PanicLevel:
  48. levelColor = red
  49. case logrus.InfoLevel:
  50. levelColor = blue
  51. default:
  52. levelColor = blue
  53. }
  54. levelText := strings.ToUpper(entry.Level.String())
  55. if !f.DisableColors {
  56. switch {
  57. case f.DisableTimestamp:
  58. fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m %-44s", levelColor, levelText, entry.Message)
  59. case !f.FullTimestamp:
  60. fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), entry.Message)
  61. default:
  62. fmt.Fprintf(b, "%s \x1b[%dm%s\x1b[0m %-44s", entry.Time.Format(timestampFormat), levelColor, levelText, entry.Message)
  63. }
  64. } else {
  65. switch {
  66. case f.DisableTimestamp:
  67. fmt.Fprintf(b, "%s %-44s", levelText, entry.Message)
  68. case !f.FullTimestamp:
  69. fmt.Fprintf(b, "%s[%04d] %-44s", levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), entry.Message)
  70. default:
  71. fmt.Fprintf(b, "[%s] %s %-44s", entry.Time.Format(timestampFormat), levelText, entry.Message)
  72. }
  73. }
  74. }