1

我正在使用 Logrus,但&在其日志中显示字符时遇到了问题:

logger.WithFields(logrus.Fields{
        "value": "value&value",
}).Info("GET")

这打印value\u0026value即十六进制值&而不是&自身

任何人都知道如何解决这个问题?

如果它可能有帮助,这里是记录器的初始化方式:

    import (
       "log"

       "github.com/getsentry/sentry-go"
       sentry_hook "github.com/onrik/logrus/sentry"
       "github.com/pkg/errors"
       "github.com/sirupsen/logrus"
    )

    func newLogger() *logrus.Entry {
        log := logrus.StandardLogger()
    
        log.SetFormatter(&logrus.JSONFormatter{})
    
        level, err := logrus.ParseLevel(config.LogLevel)
        if err != nil {
            log.Fatalf("%+v", errors.WithStack(err))
        }
        log.SetLevel(level)
    
        hook := newSentryHook()
        log.AddHook(hook)
    
        entry := logrus.NewEntry(log)
    
        return entry
    }
    
    func newSentryHook() *sentry_hook.Hook {
        if err := sentry.Init(sentry.ClientOptions{Dsn: config.SentryDSN}); err != nil {
            log.Fatalf("%+v", errors.WithStack(err))
        }
        hook, err := sentry_hook.NewHook(sentry_hook.Options{Dsn: config.SentryDSN}, logrus.PanicLevel, logrus.FatalLevel, logrus.ErrorLevel)
        if err != nil {
            log.Fatalf("%+v", errors.WithStack(err))
        }
        return hook
    }
4

1 回答 1

4

这是 json 包的默认行为

默认行为是将 &、< 和 > 转义为 \u0026、\u003c 和 \u003e,以避免在 HTML 中嵌入 JSON 时可能出现的某些安全问题。

在转义干扰输出可读性的非 HTML 设置中,SetEscapeHTML(false) 禁用此行为。

Logrus 在JSONFormatter.DisableHTMLEscape 字段中公开此设置。要禁用 HTML 转义,请将其设置为 true:

log.SetFormatter(&logrus.JSONFormatter{
    DisableHTMLEscape: true,
})
于 2020-07-21T09:16:46.823 回答