间歇性地,我看到通过我的自定义日志中间件将截断的 json 对象写入 loggly。我已经确认传出记录实际上在我的代码中被截断。
日志用 zerolog 格式化,然后在 stdout 和 loggly 之间输出。
我使用的 loggly 包已经很老了,但似乎只是io.Writer
用缓冲区https://github.com/segmentio/go-loggly实现了一个。
我担心的是杜松子酒在将日志写入缓冲区之前终止上下文,写入被缩短了吗?但是在 gin 文档提供的示例中,我没有看到任何截然不同的东西。我已经删除了尽可能多的仍然遇到问题的无关代码。
写入 STDOUT 的日志是完整的,但是通过 loggly 包发出的日志正在被截断。
package main
import (
"io"
"os"
"github.com/gin-gonic/gin"
"github.com/rs/zerolog"
"github.com/segmentio/go-loggly"
)
var logglyClient *loggly.Client
func init() {
logglyToken := "potato"
logglyClient = loggly.New(logglyToken)
}
func NewLogger() zerolog.Logger {
writers := []io.Writer{zerolog.ConsoleWriter{Out: os.Stdout}}
writers = append(writers, logglyClient)
multiWriter := zerolog.MultiLevelWriter(writers...)
logger := zerolog.New(multiWriter).With().Timestamp().Logger()
return logger
}
func GinMiddleware() gin.HandlerFunc {
return func(gctx *gin.Context) {
logger := NewLogger()
logger.Info().Msg("API request")
gctx.Next()
}
}
func main() {
router := gin.New()
router.Use(GinMiddleware())
logger := NewLogger()
router.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
logger.Info().Msg("Server Listening!")
router.Run(":8080")
}
使用以下软件包
github.com/gin-gonic/gin v1.7.7
github.com/rs/zerolog v1.26.0
github.com/segmentio/go-loggly v0.5.0