integration.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package golog
  2. // ExternalLogger is a typical logger interface.
  3. // Any logger or printer that completes this interface
  4. // can be used to intercept and handle the golog's messages.
  5. //
  6. // See `Logger#Install` and `Logger#Handle` for more.
  7. type ExternalLogger interface {
  8. Print(...interface{})
  9. Println(...interface{})
  10. Error(...interface{})
  11. Warn(...interface{})
  12. Info(...interface{})
  13. Debug(...interface{})
  14. }
  15. // integrateExternalLogger is a Handler which
  16. // intercepts all messages from print functions,
  17. // between print action and actual write to the output,
  18. // and sends these (messages) to the external "logger".
  19. //
  20. // In short terms, when this handler is passed via `Handle`
  21. // then, instead of printing from the logger's Printer
  22. // it prints from the given "logger".
  23. func integrateExternalLogger(logger ExternalLogger) Handler {
  24. return func(log *Log) bool {
  25. printFunc := getExternalPrintFunc(logger, log)
  26. printFunc(log.Message)
  27. return true
  28. }
  29. }
  30. func getExternalPrintFunc(logger ExternalLogger, log *Log) func(...interface{}) {
  31. switch log.Level {
  32. case ErrorLevel:
  33. return logger.Error
  34. case WarnLevel:
  35. return logger.Warn
  36. case InfoLevel:
  37. return logger.Info
  38. case DebugLevel:
  39. return logger.Debug
  40. }
  41. // disable level or use of golog#Print/Println functions:
  42. // passed with Println
  43. if log.NewLine {
  44. return logger.Println
  45. }
  46. return logger.Print
  47. }
  48. // StdLogger is the standard log.Logger interface.
  49. // Any logger or printer that completes this interface
  50. // can be used to intercept and handle the golog's messages.
  51. //
  52. // See `Logger#Install` and `Logger#Handle` for more.
  53. type StdLogger interface {
  54. Printf(format string, v ...interface{})
  55. Print(v ...interface{})
  56. Println(v ...interface{})
  57. }
  58. func integrateStdLogger(logger StdLogger) Handler {
  59. return func(log *Log) bool {
  60. printFunc := getStdPrintFunc(logger, log)
  61. printFunc(log.Message)
  62. return true
  63. }
  64. }
  65. func getStdPrintFunc(logger StdLogger, log *Log) func(...interface{}) {
  66. // no levels here
  67. // passed with Println
  68. if log.NewLine {
  69. return logger.Println
  70. }
  71. return logger.Print
  72. }