亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Zap logger 是否支持轉義字符 '\n' 和 '\t' 來打印換行

Zap logger 是否支持轉義字符 '\n' 和 '\t' 來打印換行

Go
浮云間 2022-10-10 16:12:26
func InitLogger() {    loggerMgr, err := zap.NewProduction()    if err != nil {        log.Println("error")    }    defer loggerMgr.Sync()    logger := loggerMgr.Sugar()    logger.Error("START!")}結果{"level":"error","ts":1635248463.347698,"caller":"cgw-go-utils/main.go:36","msg":"START!","stacktrace":"main.raiseError \n\t/Users/I053322/dev/repo/cgw-go-utils/main.go:36\nmain.main\n\t/Users/I053322/dev/repo/cgw-go-utils/main.go :22\nruntime.main\n\t/usr/local/opt/go/libexec/src/runtime/proc.go:225"}我想得到逃避的結果{"level":"error","ts":1635248463.347698,"caller":"cgw-go-utils/main.go:36","msg":"START!","stacktrace":"main.raiseError    /Users/I053322/dev/repo/cgw-go-utils/main.go:36main.main    /Users/I053322/dev/repo/cgw-go-utils/main.go:22runtime.main    /usr/local/opt/go/libexec/src/runtime/proc.go:225"}
查看完整描述

2 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

不。


zap.NewProduction()返回一個帶有 JSON 編碼的記錄器,并將轉義序列\n逐字編碼\t為JSON。如果沒有,它就不是有效的 JSON。


如果你真的必須,并且你可以生成無效的 JSON,你可以通過裝飾現有的 zap JSON 編碼器來實現你自己的編碼器。


示范代碼:


package main


import (

    "bytes"

    "go.uber.org/zap"

    "go.uber.org/zap/buffer"

    "go.uber.org/zap/zapcore"

    "os"

)


func main() {

    core := zapcore.NewCore(

        &EscapeSeqJSONEncoder{ Encoder: zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) },

        os.Stdout,

        zapcore.InfoLevel,

    )

    logger := zap.New(core)

    logger.Info("foo", zap.String("some_field", "foo\nbar"))

}


type EscapeSeqJSONEncoder struct {

    zapcore.Encoder

}


func (enc *EscapeSeqJSONEncoder) Clone() zapcore.Encoder {

    return enc // TODO: change me

}


func (enc *EscapeSeqJSONEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*buffer.Buffer, error) {

    // call EncodeEntry on the embedded interface to get the 

    // original output

    b, err := enc.Encoder.EncodeEntry(entry, fields)

    if err != nil {

        return nil, err

    }

    newb := buffer.NewPool().Get()


    // then manipulate that output into what you need it to be

    newb.Write(bytes.Replace(b.Bytes(), []byte("\\n"), []byte("\n"), -1))

    return newb, nil

}

輸出:


{"level":"info","ts":1635257984.618096,"msg":"foo","some_field":"foo

bar"}

注意:該函數zapcore.NewCore接受一個zapcore.Encoder參數,它是一個接口。這個接口實現起來很麻煩。這個想法是將它嵌入到您的自定義結構中,以便您免費獲得所有方法。


查看完整回答
反對 回復 2022-10-10
?
米脂

TA貢獻1836條經驗 獲得超3個贊

您可以將 zap.Config 編碼設置為“控制臺”


zapConfig := zap.Config{

    Level:       level,

    Development: false,

    Sampling: &zap.SamplingConfig{

        Initial:    100,

        Thereafter: 100,

    },

    Encoding:         "console",

    EncoderConfig:    zapEncoderConfig,

    OutputPaths:      []string{"stderr"},

    ErrorOutputPaths: []string{"stderr"},

}


return zapConfig.Build()


查看完整回答
反對 回復 2022-10-10
  • 2 回答
  • 0 關注
  • 397 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號