log.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package logging
  2. import (
  3. "fmt"
  4. "io"
  5. stdlog "log"
  6. "os"
  7. kitlog "github.com/go-kit/kit/log"
  8. "github.com/pkg/errors"
  9. )
  10. var closeChan chan<- os.Signal
  11. // SetCloseChan sets a signal channel that is sent to when CheckFatal is used
  12. func SetCloseChan(c chan<- os.Signal) {
  13. closeChan = c
  14. }
  15. // CheckFatal exits the process if err != nil
  16. func CheckFatal(err error) {
  17. if err != nil {
  18. l := internal
  19. if l == nil {
  20. l = kitlog.NewLogfmtLogger(kitlog.NewSyncWriter(os.Stderr))
  21. l = kitlog.With(l, "module", "logging", "caller", kitlog.DefaultCaller)
  22. }
  23. l.Log("check", "fatal", "err", err)
  24. if err := LogPanicWithStack(l, "CheckFatal", err); err != nil {
  25. panic(errors.Wrap(err, "CheckFatal could not dump error"))
  26. }
  27. if closeChan != nil {
  28. l.Log("check", "notice", "msg", "Sending close message")
  29. closeChan <- os.Interrupt
  30. }
  31. os.Exit(1)
  32. }
  33. }
  34. var internal kitlog.Logger
  35. // SetupLogging will initialize the logger backend and set the flags.
  36. func SetupLogging(w io.Writer) {
  37. if w == nil {
  38. w = os.Stderr
  39. }
  40. logger := kitlog.NewLogfmtLogger(kitlog.NewSyncWriter(w))
  41. if internal != nil {
  42. logger.Log("event", "warning", "msg", "logging inited twice")
  43. return
  44. }
  45. if lvl := os.Getenv("CRYPTIX_LOGLVL"); lvl != "" {
  46. logger.Log("module", "logging", "error", "CRYPTIX_LOGLVL is obsolete. levels are bad, mkay?")
  47. }
  48. // wrap logger to error-check the writes only once
  49. internal = kitlog.LoggerFunc(func(keyvals ...interface{}) error {
  50. if err := logger.Log(keyvals...); err != nil {
  51. fmt.Fprintf(w, "warning: logger.Write() failed! %s - vals: %v", err, keyvals)
  52. panic(err) // no other way to escalate this
  53. }
  54. return nil
  55. })
  56. internal = kitlog.With(internal, "time", kitlog.DefaultTimestamp, "caller", kitlog.DefaultCaller)
  57. stdlog.SetOutput(kitlog.NewStdlibAdapter(kitlog.With(internal, "module", "stdlib")))
  58. }
  59. // Interface renames the (go-kit/log).Logger interface for conveninence
  60. type Interface kitlog.Logger
  61. // Logger returns an Entry where the module field is set to name
  62. func Logger(name string) kitlog.Logger {
  63. l := internal
  64. if l == nil {
  65. l = kitlog.NewLogfmtLogger(kitlog.NewSyncWriter(os.Stderr))
  66. l = kitlog.With(l, "warning", "uninitizialized", kitlog.DefaultCaller)
  67. }
  68. if name == "" {
  69. l.Log("module", "logger", "error", "missing name parameter")
  70. name = "undefined"
  71. }
  72. return kitlog.With(l, "module", name)
  73. }