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.

101 lines
1.9 KiB

2 years ago
  1. package logruspan
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "gitea.baoapi.com/root/stu_uuos/config"
  7. "github.com/sirupsen/logrus"
  8. "log"
  9. "net/http"
  10. "time"
  11. )
  12. //setupLogrus 初始化logrus 同时把logrus的logger var 引用到这个common.Logger
  13. func setupLogrus(cc config.LogrusHttp) error {
  14. logLvl, err := logrus.ParseLevel(cc.LogLvl)
  15. if err != nil {
  16. return err
  17. }
  18. Lobj.SetLevel(logLvl)
  19. Lobj.SetReportCaller(true)
  20. Lobj.SetFormatter(&logrus.JSONFormatter{})
  21. esh := newHttpHook(cc)
  22. Lobj.AddHook(esh)
  23. return nil
  24. }
  25. var Lobj *logrus.Logger
  26. func LogInitHttp() {
  27. cc := *config.GetConfig().LogrusHttp
  28. Lobj = logrus.New()
  29. err := setupLogrus(cc)
  30. if err != nil {
  31. log.Fatal(err)
  32. }
  33. }
  34. //esHook 自定义的ES hook
  35. type esHook struct {
  36. client *http.Client
  37. Url string
  38. Cont string
  39. }
  40. //newEsHook 初始化
  41. func newHttpHook(cc config.LogrusHttp) *esHook {
  42. //application/json;charset:utf-8;
  43. es := &http.Client{}
  44. return &esHook{
  45. client: es,
  46. Url: cc.Url + "/logger",
  47. Cont: "application/json;charset:utf-8;",
  48. }
  49. }
  50. //Fire logrus hook interface 方法
  51. func (hook *esHook) Fire(entry *logrus.Entry) error {
  52. go hook.sendHttp(entry)
  53. return nil
  54. }
  55. //Levels logrus hook interface 方法
  56. func (hook *esHook) Levels() []logrus.Level {
  57. return []logrus.Level{
  58. logrus.PanicLevel,
  59. logrus.FatalLevel,
  60. logrus.ErrorLevel,
  61. logrus.InfoLevel,
  62. }
  63. }
  64. //sendEs 异步发送日志到es
  65. func (hook *esHook) sendHttp(e *logrus.Entry) {
  66. defer func() {
  67. if r := recover(); r != nil {
  68. fmt.Println("send entry to http failed: ", r)
  69. }
  70. }()
  71. ins := map[string]interface{}{}
  72. for kk, vv := range e.Data {
  73. ins[kk] = vv
  74. }
  75. ins["time"] = time.Now().Local()
  76. ins["level"] = e.Level
  77. ins["message"] = e.Message
  78. ins["caller"] = fmt.Sprintf("%s:%d %#v", e.Caller.File, e.Caller.Line, e.Caller.Func)
  79. bs, err := json.Marshal(ins)
  80. br := bytes.NewBuffer(bs)
  81. _, err = hook.client.Post(hook.Url, hook.Cont, br)
  82. if err != nil {
  83. logrus.Println(err)
  84. }
  85. }