下面是使用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)
我错过了什么吗?
答案 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")
}
}