package logger import ( "bytes" "log" "testing" "go.uber.org/zap" "go.uber.org/zap/buffer" "go.uber.org/zap/zapcore" ) func TestLogVsLogLn(t *testing.T) { defer func() { logger = nil }() var buf bytes.Buffer testLogEqual := func(want string) { s := buf.String() if s != want { t.Errorf("got %s, want %s", s, want) } buf.Reset() } core := zapcore.NewCore( onlyMessage{}, zapcore.AddSync(&buf), zapcore.DebugLevel, ) l := zap.New(core) logger = l.Sugar() // logger.[Level] 系列的函数,因为受到底层 fmt.Sprint 的影响 // 在处理 string 时不会添加默认的空格 logger.Info(1, "2", 3) testLogEqual("123") // 而 logger.[Level]ln 系列的函数,因为底层使用的是 fmt.Sprintln // 所以会正常输出空格 logger.Infoln(1, "2", 3) testLogEqual("1 2 3") stdLog := log.New(&buf, "", 0) // 标准库的 log 包的行为同样如此 // 末尾的换行符是 log 包自动添加的 stdLog.Print(1, "2", 3) testLogEqual("123\n") stdLog.Println(1, "2", 3) testLogEqual("1 2 3\n") } // 调试用,只重写了 EncodeEntry 方法。 // 调用其他方法就 panic type onlyMessage struct{ zapcore.Encoder } var pool = buffer.NewPool() func (onlyMessage) EncodeEntry(e zapcore.Entry, _ []zapcore.Field) (*buffer.Buffer, error) { b := pool.Get() b.AppendString(e.Message) return b, nil }