logger_test.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package logger
  2. import (
  3. "bytes"
  4. "log"
  5. "testing"
  6. "go.uber.org/zap"
  7. "go.uber.org/zap/buffer"
  8. "go.uber.org/zap/zapcore"
  9. )
  10. func TestLogVsLogLn(t *testing.T) {
  11. defer func() { logger = nil }()
  12. var buf bytes.Buffer
  13. testLogEqual := func(want string) {
  14. s := buf.String()
  15. if s != want {
  16. t.Errorf("got %s, want %s", s, want)
  17. }
  18. buf.Reset()
  19. }
  20. core := zapcore.NewCore(
  21. onlyMessage{},
  22. zapcore.AddSync(&buf),
  23. zapcore.DebugLevel,
  24. )
  25. l := zap.New(core)
  26. logger = l.Sugar()
  27. // logger.[Level] 系列的函数,因为受到底层 fmt.Sprint 的影响
  28. // 在处理 string 时不会添加默认的空格
  29. logger.Info(1, "2", 3)
  30. testLogEqual("123")
  31. // 而 logger.[Level]ln 系列的函数,因为底层使用的是 fmt.Sprintln
  32. // 所以会正常输出空格
  33. logger.Infoln(1, "2", 3)
  34. testLogEqual("1 2 3")
  35. stdLog := log.New(&buf, "", 0)
  36. // 标准库的 log 包的行为同样如此
  37. // 末尾的换行符是 log 包自动添加的
  38. stdLog.Print(1, "2", 3)
  39. testLogEqual("123\n")
  40. stdLog.Println(1, "2", 3)
  41. testLogEqual("1 2 3\n")
  42. }
  43. // 调试用,只重写了 EncodeEntry 方法。
  44. // 调用其他方法就 panic
  45. type onlyMessage struct{ zapcore.Encoder }
  46. var pool = buffer.NewPool()
  47. func (onlyMessage) EncodeEntry(e zapcore.Entry, _ []zapcore.Field) (*buffer.Buffer, error) {
  48. b := pool.Get()
  49. b.AppendString(e.Message)
  50. return b, nil
  51. }