stdlog.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package hclog
  2. import (
  3. "bytes"
  4. "strings"
  5. )
  6. // Provides a io.Writer to shim the data out of *log.Logger
  7. // and back into our Logger. This is basically the only way to
  8. // build upon *log.Logger.
  9. type stdlogAdapter struct {
  10. hl Logger
  11. inferLevels bool
  12. }
  13. // Take the data, infer the levels if configured, and send it through
  14. // a regular Logger
  15. func (s *stdlogAdapter) Write(data []byte) (int, error) {
  16. str := string(bytes.TrimRight(data, " \t\n"))
  17. if s.inferLevels {
  18. level, str := s.pickLevel(str)
  19. switch level {
  20. case Trace:
  21. s.hl.Trace(str)
  22. case Debug:
  23. s.hl.Debug(str)
  24. case Info:
  25. s.hl.Info(str)
  26. case Warn:
  27. s.hl.Warn(str)
  28. case Error:
  29. s.hl.Error(str)
  30. default:
  31. s.hl.Info(str)
  32. }
  33. } else {
  34. s.hl.Info(str)
  35. }
  36. return len(data), nil
  37. }
  38. // Detect, based on conventions, what log level this is
  39. func (s *stdlogAdapter) pickLevel(str string) (Level, string) {
  40. switch {
  41. case strings.HasPrefix(str, "[DEBUG]"):
  42. return Debug, strings.TrimSpace(str[7:])
  43. case strings.HasPrefix(str, "[TRACE]"):
  44. return Trace, strings.TrimSpace(str[7:])
  45. case strings.HasPrefix(str, "[INFO]"):
  46. return Info, strings.TrimSpace(str[6:])
  47. case strings.HasPrefix(str, "[WARN]"):
  48. return Warn, strings.TrimSpace(str[7:])
  49. case strings.HasPrefix(str, "[ERROR]"):
  50. return Error, strings.TrimSpace(str[7:])
  51. case strings.HasPrefix(str, "[ERR]"):
  52. return Error, strings.TrimSpace(str[5:])
  53. default:
  54. return Info, str
  55. }
  56. }