hclog_adapter.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package logger
  2. import (
  3. "io"
  4. "log"
  5. "github.com/hashicorp/go-hclog"
  6. )
  7. // HCLogAdapter is an adapter for hclog.Logger
  8. type HCLogAdapter struct {
  9. hclog.Logger
  10. }
  11. // Log emits a message and key/value pairs at a provided log level
  12. func (l *HCLogAdapter) Log(level hclog.Level, msg string, args ...interface{}) {
  13. logger.LogWithKeyVals(level, l.Name(), msg, args...)
  14. }
  15. // Trace emits a message and key/value pairs at the TRACE level
  16. func (l *HCLogAdapter) Trace(msg string, args ...interface{}) {
  17. l.Log(hclog.Debug, msg, args...)
  18. }
  19. // Debug emits a message and key/value pairs at the DEBUG level
  20. func (l *HCLogAdapter) Debug(msg string, args ...interface{}) {
  21. l.Log(hclog.Debug, msg, args...)
  22. }
  23. // Info emits a message and key/value pairs at the INFO level
  24. func (l *HCLogAdapter) Info(msg string, args ...interface{}) {
  25. l.Log(hclog.Info, msg, args...)
  26. }
  27. // Warn emits a message and key/value pairs at the WARN level
  28. func (l *HCLogAdapter) Warn(msg string, args ...interface{}) {
  29. l.Log(hclog.Warn, msg, args...)
  30. }
  31. // Error emits a message and key/value pairs at the ERROR level
  32. func (l *HCLogAdapter) Error(msg string, args ...interface{}) {
  33. l.Log(hclog.Error, msg, args...)
  34. }
  35. // With creates a sub-logger
  36. func (l *HCLogAdapter) With(args ...interface{}) hclog.Logger {
  37. return &HCLogAdapter{Logger: l.Logger.With(args...)}
  38. }
  39. // Named creates a logger that will prepend the name string on the front of all messages
  40. func (l *HCLogAdapter) Named(name string) hclog.Logger {
  41. return &HCLogAdapter{Logger: l.Logger.Named(name)}
  42. }
  43. // StandardLogger returns a value that conforms to the stdlib log.Logger interface
  44. func (l *HCLogAdapter) StandardLogger(opts *hclog.StandardLoggerOptions) *log.Logger {
  45. return log.New(&StdLoggerWrapper{Sender: l.Name()}, "", 0)
  46. }
  47. // StandardWriter returns a value that conforms to io.Writer, which can be passed into log.SetOutput()
  48. func (l *HCLogAdapter) StandardWriter(opts *hclog.StandardLoggerOptions) io.Writer {
  49. return &StdLoggerWrapper{Sender: l.Name()}
  50. }
  51. // StdLoggerWrapper is a wrapper for standard logger compatibility
  52. type StdLoggerWrapper struct {
  53. Sender string
  54. }
  55. // Write implements the io.Writer interface. This is useful to set as a writer
  56. // for the standard library log.
  57. func (l *StdLoggerWrapper) Write(p []byte) (n int, err error) {
  58. n = len(p)
  59. if n > 0 && p[n-1] == '\n' {
  60. // Trim CR added by stdlog.
  61. p = p[0 : n-1]
  62. }
  63. logger.Log(hclog.Error, l.Sender, "", string(p))
  64. return
  65. }