Go语言 如何使用日志中间件

hgncfbus  于 2023-11-14  发布在  Go
关注(0)|答案(4)|浏览(99)

下面是我使用Labstack的Echo在Go中编写的Web应用程序的入口点:

  1. package main
  2. import (
  3. "github.com/labstack/echo"
  4. mw "github.com/labstack/echo/middleware"
  5. )
  6. func main() {
  7. controller := controllers.NewUserController(getSession())
  8. app := echo.New()
  9. app.Use(mw.Logger())
  10. app.Use(mw.Recover())
  11. app.SetDebug(true)
  12. app.Post("/users", controller.CreateUser)
  13. app.Get("/users", controller.ListUsers)
  14. app.Get("/users/:id", controller.GetUser)
  15. app.Patch("/users/:id", controller.UpdateUser)
  16. app.Delete("/users/:id", controller.DeleteUser)
  17. app.Run(":8000")
  18. }

字符串
如何重用Echo应用程序中示例化的日志中间件?我已经尝试过:
组件控制器

  1. import (
  2. "net/http"
  3. "github.com/labstack/echo"
  4. "gopkg.in/mgo.v2"
  5. "gopkg.in/mgo.v2/bson"
  6. )
  7. type (
  8. UserController struct {
  9. session *mgo.Session
  10. }
  11. )
  12. func NewUserController(s *mgo.Session) *UserController {
  13. return &UserController{s}
  14. }
  15. func (userController UserController) CreateUser(context *echo.Context) error {
  16. user := &models.User{}
  17. if err := context.Bind(user); err != nil {
  18. context.Echo().Logger().Error("Error creating user")
  19. return err
  20. }
  21. user.Id = bson.NewObjectId()
  22. userController.session.DB("test").C("users").Insert(user)
  23. context.Echo().Logger().Debug("Created user", id)
  24. return context.JSON(http.StatusCreated, user)
  25. }


即使上面的代码编译成功,

  1. context.Echo().Logger().Debug("Created user", id)

产生任何输出.而下面的语句产生

  1. context.Echo().Logger().Info("Created user", id)


我错过什么了吗?

idv4meu8

idv4meu81#

我刚开始使用Echo,不知道自发布以来是否有任何变化,但我发现您可以直接导入labstack的logger:

  1. import "github.com/labstack/gommon/log"

字符串
然后使用它:

  1. log.Debug("Created user", id)

z2acfund

z2acfund2#

默认情况下,echo使用“INFO”日志级别。因此,任何低于“INFO”级别的内容都会显示。
如果你也想看到“DEBUG”,你需要将级别设置为“DEBUG”:

  1. import "github.com/labstack/gommon/log"
  2. e.Logger.SetLevel(log.DEBUG)

字符串
层次结构:

  1. DEBUG
  2. INFO
  3. WARN
  4. ERROR
  5. OFF

jexiocij

jexiocij3#

您可以使用第三方日志记录中间件,如https://github.com/sirupsen/logrus
第一个月
例如
创建日志条目功能:

  1. func makeLogEntry(c echo.Context) *log.Entry {
  2. if c == nil {
  3. return log.WithFields(log.Fields{
  4. "at": time.Now().Format("2006-01-02 15:04:05"),
  5. })
  6. }
  7. return log.WithFields(log.Fields{
  8. "at": time.Now().Format("2006-01-02 15:04:05"),
  9. "method": c.Request().Method,
  10. "uri": c.Request().URL.String(),
  11. "ip": c.Request().RemoteAddr,
  12. })
  13. }

字符串
然后:

  1. func middlewareLogging(next echo.HandlerFunc) echo.HandlerFunc {
  2. return func(c echo.Context) error {
  3. makeLogEntry(c).Info("incoming request")
  4. return next(c)
  5. }
  6. }
  7. func errorHandler(err error, c echo.Context) {
  8. report, ok := err.(*echo.HTTPError)
  9. if ok {
  10. report.Message = fmt.Sprintf("http error %d - %v", report.Code, report.Message)
  11. } else {
  12. report = echo.NewHTTPError(http.StatusInternalServerError, err.Error())
  13. }
  14. makeLogEntry(c).Error(report.Message)
  15. c.HTML(report.Code, report.Message.(string))
  16. }


在main()函数中:

  1. func main() {
  2. e := echo.New()
  3. e.Use(middlewareLogging)
  4. e.HTTPErrorHandler = errorHandler
  5. e.GET("/index", func(c echo.Context) error {
  6. return c.JSON(http.StatusOK, true)
  7. })
  8. lock := make(chan error)
  9. go func(lock chan error) {
  10. lock <- e.Start(":9000")
  11. }(lock)
  12. time.Sleep(1 * time.Millisecond)
  13. makeLogEntry(nil).Warning("application started without ssl/tls enabled")
  14. err := <-lock
  15. if err != nil {
  16. makeLogEntry(nil).Panic("failed to start application")
  17. }
  18. }

展开查看全部
bis0qfac

bis0qfac4#

技术上来说我有两个选择

1)将logger添加到上下文中

  1. func NewRestServer(...
  2. logger := "initialize your logger as you like"
  3. > e.Use(mw.AddContextLogger(logger)) // attach everywher
  4. or
  5. > ctxLog := mw.AddContextLogger(logger)
  6. > e.GET("/endpoint", Handler, ctxLog) // single attachment

字符串
该记录器的实现看起来类似(取决于您将使用的记录器包)

  1. package mw
  2. import (
  3. "go.uber.org/zap"
  4. "github.com/labstack/echo/v4"
  5. )
  6. func AddContextLogger(logger zap.Logger) echo.MiddlewareFunc {
  7. return func(next echo.HandlerFunc) echo.HandlerFunc {
  8. return func(c echo.Context) error {
  9. c.Set("logger", logger)
  10. return next(c)
  11. }
  12. }
  13. }

2)为自己创建一个API包,即

并将其作为依赖项注入

  1. package v1
  2. type Api struct {
  3. UsersAPI
  4. InvoicesAPI
  5. logger logging.Logger
  6. }
  7. func NewApi(logger logging.Logger) *Api {
  8. return &Api{
  9. UsersAPI: UsersAPI{logger: logger},
  10. InvoicesAPI: InvoicesAPI{logger: logger},
  11. logger: logger,
  12. }
  13. }


和使用本

  1. func NewRestServer(...
  2. logger := "initialize your logger as you like"
  3. v1api := v1.NewApi(logger)


并通过

  1. e.GET("/v1/users", v1api.Users(c))


在v1api包中,您将拥有

  1. func (a *api) Method1(...) (...) {
  2. a.logger.Info("test")
  3. }

展开查看全部

相关问题