如何使用日志记录中间件

时间:2016-03-01 12:06:05

标签: go echo-framework

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

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

包裹控制器

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 个答案:

答案 0 :(得分:2)

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

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

然后使用它:

log.Debug("Created user", id)

答案 1 :(得分:1)

默认情况下,回显使用“ INFO”日志级别。因此,低于“ INFO”级别的所有内容都会显示出来。

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

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

层次结构:

DEBUG
INFO
WARN
ERROR
OFF

答案 2 :(得分:1)

您可以使用 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")
    }
}