Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

zerolog.go 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package logger
  2. import (
  3. "fmt"
  4. "github.com/9seconds/mtg/v2/mtglib"
  5. "github.com/rs/zerolog"
  6. )
  7. const loggerFieldName = "logger"
  8. type zeroLogContextVarType uint8
  9. const (
  10. zeroLogContextVarTypeUnknown zeroLogContextVarType = iota
  11. zeroLogContextVarTypeStr
  12. zeroLogContextVarTypeInt
  13. )
  14. type zeroLogContext struct {
  15. name string
  16. log *zerolog.Logger
  17. ctxVarType zeroLogContextVarType
  18. ctxVarName string
  19. ctxVarStr string
  20. ctxVarInt int
  21. parent *zeroLogContext
  22. }
  23. func (z *zeroLogContext) Named(name string) mtglib.Logger {
  24. loggerName := z.name
  25. if loggerName == "" {
  26. loggerName = name
  27. } else {
  28. loggerName += "." + name
  29. }
  30. return &zeroLogContext{
  31. name: loggerName,
  32. log: z.log,
  33. parent: z,
  34. }
  35. }
  36. func (z *zeroLogContext) BindInt(name string, value int) mtglib.Logger {
  37. return &zeroLogContext{
  38. name: z.name,
  39. log: z.log,
  40. ctxVarType: zeroLogContextVarTypeInt,
  41. ctxVarInt: value,
  42. ctxVarName: name,
  43. parent: z,
  44. }
  45. }
  46. func (z *zeroLogContext) BindStr(name, value string) mtglib.Logger {
  47. return &zeroLogContext{
  48. name: z.name,
  49. log: z.log,
  50. ctxVarType: zeroLogContextVarTypeStr,
  51. ctxVarStr: value,
  52. ctxVarName: name,
  53. parent: z,
  54. }
  55. }
  56. func (z *zeroLogContext) Printf(format string, args ...interface{}) {
  57. z.Debug(fmt.Sprintf(format, args...))
  58. }
  59. func (z *zeroLogContext) Info(msg string) {
  60. z.InfoError(msg, nil)
  61. }
  62. func (z *zeroLogContext) Warning(msg string) {
  63. z.WarningError(msg, nil)
  64. }
  65. func (z *zeroLogContext) Debug(msg string) {
  66. z.DebugError(msg, nil)
  67. }
  68. func (z *zeroLogContext) InfoError(msg string, err error) {
  69. z.emitLog(z.log.Info(), msg, err)
  70. }
  71. func (z *zeroLogContext) WarningError(msg string, err error) {
  72. z.emitLog(z.log.Warn(), msg, err)
  73. }
  74. func (z *zeroLogContext) DebugError(msg string, err error) {
  75. z.emitLog(z.log.Debug(), msg, err)
  76. }
  77. func (z *zeroLogContext) emitLog(evt *zerolog.Event, msg string, err error) {
  78. z.attachCtx(evt)
  79. for current := z.parent; current != nil; current = current.parent {
  80. current.attachCtx(evt)
  81. }
  82. evt.Str(loggerFieldName, z.name).Err(err).Msg(msg)
  83. }
  84. func (z *zeroLogContext) attachCtx(evt *zerolog.Event) {
  85. switch z.ctxVarType {
  86. case zeroLogContextVarTypeStr:
  87. evt.Str(z.ctxVarName, z.ctxVarStr)
  88. case zeroLogContextVarTypeInt:
  89. evt.Int(z.ctxVarName, z.ctxVarInt)
  90. case zeroLogContextVarTypeUnknown:
  91. }
  92. }
  93. // NewZeroLogger returns a logger which is using rs/zerolog library.
  94. func NewZeroLogger(log zerolog.Logger) mtglib.Logger {
  95. return &zeroLogContext{
  96. log: &log,
  97. }
  98. }