我使用自定义日志中间件,间歇性地发现截断的json对象被写入loggly。我已确认代码中正在传出的记录确实被截断。
日志使用zerolog格式化,然后在stdout和loggly之间进行T处理。
我使用的loggly包相当老,但似乎只是实现了一个带有缓冲区的io.Writer
。https://github.com/segmentio/go-loggly.
我的担心是gin在将日志写入缓冲区之前终止了上下文,写入被截断了?但是在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
localhost:8080/ping
时,浏览器中显示{"message":"pong"}
。每次调用时,终端中也会显示INF API request
。你能帮我们重现一下吗?到底是哪里出了问题? - EmmanuelB