为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用日志中间件

如何使用日志中间件

Go
一只萌萌小番薯 2021-12-20 10:44:13
下面是我使用 Labstack 的 Echo 用 Go 编写的 Web 应用程序的入口点:package mainimport (    "github.com/labstack/echo"    mw "github.com/labstack/echo/middleware")func main() {    controller := controllers.NewUserController(getSession())    app := echo.New()    app.Use(mw.Logger())    app.Use(mw.Recover())    app.SetDebug(true)    app.Post("/users", controller.CreateUser)    app.Get("/users", controller.ListUsers)    app.Get("/users/:id", controller.GetUser)    app.Patch("/users/:id", controller.UpdateUser)    app.Delete("/users/:id", controller.DeleteUser)    app.Run(":8000")}如何重用在Echo应用程序中实例化的日志中间件?我试过这个:包控制器import (    "net/http"    "github.com/labstack/echo"    "gopkg.in/mgo.v2"    "gopkg.in/mgo.v2/bson")type (    UserController struct {        session *mgo.Session    })func NewUserController(s *mgo.Session) *UserController {    return &UserController{s}}func (userController UserController) CreateUser(context *echo.Context) error {    user := &models.User{}    if err := context.Bind(user); err != nil {        context.Echo().Logger().Error("Error creating user")        return err    }    user.Id = bson.NewObjectId()    userController.session.DB("test").C("users").Insert(user)    context.Echo().Logger().Debug("Created user", id)    return context.JSON(http.StatusCreated, user)}即使上面的代码编译通过,语句context.Echo().Logger().Debug("Created user", id)不产生任何输出...而下面的语句呢:context.Echo().Logger().Info("Created user", id)我错过了什么吗?
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

我刚开始使用 Echo,不知道发布后是否有任何变化,但我发现您可以导入 labstack 的记录器:

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

然后使用它:

log.Debug("Created user", id)


查看完整回答
反对 回复 2021-12-20
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

默认情况下,echo 使用“INFO”日志级别。所以任何低于“信息”级别的内容都会显示出来。


如果您还想查看“DEBUG”日志,则需要将级别设置为“DEBUG”:


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

e.Logger.SetLevel(log.DEBUG)

等级制度:


DEBUG

INFO

WARN

ERROR

OFF


查看完整回答
反对 回复 2021-12-20
?
慕森卡

TA贡献1806条经验 获得超8个赞

您可以使用 3rd 方日志中间件,例如https://github.com/sirupsen/logrus


import log "github.com/sirupsen/logrus"


例子


创建日志条目功能:


func makeLogEntry(c echo.Context) *log.Entry {

    if c == nil {

        return log.WithFields(log.Fields{

            "at": time.Now().Format("2006-01-02 15:04:05"),

        })

    }


    return log.WithFields(log.Fields{

        "at":     time.Now().Format("2006-01-02 15:04:05"),

        "method": c.Request().Method,

        "uri":    c.Request().URL.String(),

        "ip":     c.Request().RemoteAddr,

    })

}

然后:


func middlewareLogging(next echo.HandlerFunc) echo.HandlerFunc {

    return func(c echo.Context) error {

        makeLogEntry(c).Info("incoming request")

        return next(c)

    }

}


func errorHandler(err error, c echo.Context) {

    report, ok := err.(*echo.HTTPError)

    if ok {

        report.Message = fmt.Sprintf("http error %d - %v", report.Code, report.Message)

    } else {

        report = echo.NewHTTPError(http.StatusInternalServerError, err.Error())

    }


    makeLogEntry(c).Error(report.Message)

    c.HTML(report.Code, report.Message.(string))

}

然后在 main() 函数中:


func main() {

    e := echo.New()


    e.Use(middlewareLogging)

    e.HTTPErrorHandler = errorHandler


    e.GET("/index", func(c echo.Context) error {

        return c.JSON(http.StatusOK, true)

    })


    lock := make(chan error)

    go func(lock chan error) {

        lock <- e.Start(":9000")

    }(lock)


    time.Sleep(1 * time.Millisecond)

    makeLogEntry(nil).Warning("application started without ssl/tls enabled")


    err := <-lock

    if err != nil {

        makeLogEntry(nil).Panic("failed to start application")

    }

}


查看完整回答
反对 回复 2021-12-20
  • 3 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号