如何使用日志中间件

huangapple go评论73阅读模式
英文:

How to use logging middleware

问题

以下是我翻译好的内容:

下面是使用Labstack的Echo编写的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应用程序中实例化的日志中间件?我尝试了以下代码:

package controllers

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)

我是否遗漏了什么?

英文:

Here below is the entry point of my web application written in Go using Labstack's Echo:

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")
}

How do I reuse the logging middleware instantiated in the Echo application? I've tried this:

package controllers

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)
}

Even if the code above compiles, the statement

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

doesn't produce any output... while the following statement does:

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

Am I missing something?

答案1

得分: 8

我刚刚开始使用Echo,不知道自从发布以来有没有什么变化,但我发现你可以直接导入labstack的日志记录器:

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

然后使用它:

log.Debug("Created user", id)
英文:

I just started using Echo and don't know if anything has changed since this was posted, but I've found you can just import labstack's logger:

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

Then use it:

log.Debug("Created user", id)

答案2

得分: 2

默认情况下,echo使用“INFO”日志级别。因此,低于“INFO”级别的内容将被显示。

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

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

级别层次结构:

DEBUG
INFO
WARN
ERROR
OFF
英文:

By Default echo uses "INFO" Log Level. So anything below "INFO" Level gets displayed.

If you want to see "DEBUG" Logs as well, You need to set the level to "DEBUG":

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

Hierarchy:

DEBUG
INFO
WARN
ERROR
OFF

答案3

得分: 2

你可以使用第三方的日志中间件,比如https://github.com/sirupsen/logrus

导入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")
    }
}
英文:

you can use 3rd party logging middleware such as https://github.com/sirupsen/logrus

import log &quot;github.com/sirupsen/logrus&quot;

example

create log entry function:

func makeLogEntry(c echo.Context) *log.Entry {
    if c == nil {
        return log.WithFields(log.Fields{
            &quot;at&quot;: time.Now().Format(&quot;2006-01-02 15:04:05&quot;),
        })
    }

    return log.WithFields(log.Fields{
        &quot;at&quot;:     time.Now().Format(&quot;2006-01-02 15:04:05&quot;),
        &quot;method&quot;: c.Request().Method,
        &quot;uri&quot;:    c.Request().URL.String(),
        &quot;ip&quot;:     c.Request().RemoteAddr,
    })
}

then:

func middlewareLogging(next echo.HandlerFunc) echo.HandlerFunc {
    return func(c echo.Context) error {
        makeLogEntry(c).Info(&quot;incoming request&quot;)
        return next(c)
    }
}

func errorHandler(err error, c echo.Context) {
    report, ok := err.(*echo.HTTPError)
    if ok {
        report.Message = fmt.Sprintf(&quot;http error %d - %v&quot;, report.Code, report.Message)
    } else {
        report = echo.NewHTTPError(http.StatusInternalServerError, err.Error())
    }

    makeLogEntry(c).Error(report.Message)
    c.HTML(report.Code, report.Message.(string))
}

and then in main() function:

func main() {
	e := echo.New()

	e.Use(middlewareLogging)
	e.HTTPErrorHandler = errorHandler

	e.GET(&quot;/index&quot;, func(c echo.Context) error {
		return c.JSON(http.StatusOK, true)
	})

	lock := make(chan error)
	go func(lock chan error) {
		lock &lt;- e.Start(&quot;:9000&quot;)
	}(lock)

	time.Sleep(1 * time.Millisecond)
	makeLogEntry(nil).Warning(&quot;application started without ssl/tls enabled&quot;)

	err := &lt;-lock
	if err != nil {
		makeLogEntry(nil).Panic(&quot;failed to start application&quot;)
	}
}

huangapple
  • 本文由 发表于 2016年3月1日 20:06:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/35722459.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定