英文:
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 "github.com/sirupsen/logrus"
example
create log entry function:
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,
})
}
then:
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))
}
and then in main() function:
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")
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论