首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用日志中间件

如何使用日志中间件
EN

Stack Overflow用户
提问于 2016-03-01 12:06:04
回答 3查看 12.3K关注 0票数 8

下面是我用Go编写的web应用程序的入口点,使用Labstack的Echo:

代码语言:javascript
运行
复制
package main

import (
    "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应用程序中实例化的日志记录中间件?我试过这个:

包控制器

代码语言:javascript
运行
复制
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)
}

即使上面的代码编译,语句

代码语言:javascript
运行
复制
context.Echo().Logger().Debug("Created user", id)

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

代码语言:javascript
运行
复制
context.Echo().Logger().Info("Created user", id)

我是不是遗漏了什么?

EN

回答 3

Stack Overflow用户

发布于 2017-01-09 15:49:05

我刚刚开始使用Echo,不知道发布后是否有任何变化,但我发现您只需导入Lab堆栈的记录器:

代码语言:javascript
运行
复制
import "github.com/labstack/gommon/log"

然后使用它:

代码语言:javascript
运行
复制
log.Debug("Created user", id)
票数 8
EN

Stack Overflow用户

发布于 2020-05-15 08:08:38

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

如果您也希望看到“调试”日志,则需要将级别设置为“调试”:

代码语言:javascript
运行
复制
import "github.com/labstack/gommon/log"
e.Logger.SetLevel(log.DEBUG)

等级:

代码语言:javascript
运行
复制
DEBUG
INFO
WARN
ERROR
OFF
票数 2
EN

Stack Overflow用户

发布于 2021-04-01 08:06:45

您可以使用第三方日志记录中间件(如https://github.com/sirupsen/logrus )。

import log "github.com/sirupsen/logrus"

示例

创建日志输入函数:

代码语言:javascript
运行
复制
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,
    })
}

然后:

代码语言:javascript
运行
复制
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()函数中:

代码语言:javascript
运行
复制
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")
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35722459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档