Explorar o código

修复With属性时仍会重复打印的bug
补充性能测试

jys hai 1 ano
pai
achega
57eaa37b1e
Modificáronse 2 ficheiros con 47 adicións e 7 borrados
  1. 38 0
      benchmark_test.go
  2. 9 7
      logger.go

+ 38 - 0
benchmark_test.go

@@ -0,0 +1,38 @@
+package fslog
+
+import (
+	"go.uber.org/zap"
+	"testing"
+)
+
+// 性能对比(在进行仅控制台打印前提下):
+// fslog:
+// 63.29 ns/op           16 B/op          1 allocs/op
+// zap:
+// 10.10 ns/op            0 B/op          0 allocs/op
+// 在有额外文件输出时,fslog性能为:
+// 70.65 ns/op           16 B/op          1 allocs/op
+
+func BenchmarkFSLog(b *testing.B) {
+	SetLv(ErrorLv)
+	b.Run("fslog", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			Debug("fslog")
+		}
+		b.StopTimer()
+	})
+
+	production, err := zap.NewProduction()
+	if err != nil {
+		b.Fatal(err)
+	}
+	zapLogger := production.Sugar()
+	b.Run("zap", func(b *testing.B) {
+		b.ReportAllocs()
+		for i := 0; i < b.N; i++ {
+			zapLogger.Debug("zap")
+		}
+		b.StopTimer()
+	})
+}

+ 9 - 7
logger.go

@@ -54,15 +54,14 @@ func NewLogger() *Logger {
 // 主要用于打印当前环境快照信息(变量或其他自定义信息)
 // 打印后,该信息会跟随日志一起打印
 func (l *Logger) With(k string, v any) *Logger {
-	defer l.logger.Sync()
-	l.logger = *l.logger.With(zap.Any(k, v))
-	return l
+	newL := l.clone()
+	newL.logger = *newL.logger.With(zap.Any(k, v))
+	return newL
 }
 
 // Debug 格式化打印调试级别日志
 // 不同于zap内部可变参数逻辑,该可变参数是用于,字符串格式化的
 func (l *Logger) Debug(msg string, vs ...any) {
-	defer l.logger.Sync()
 	if len(vs) == 0 {
 		l.logger.Debug(msg)
 		return
@@ -73,7 +72,6 @@ func (l *Logger) Debug(msg string, vs ...any) {
 // Info 格式化打印信息级别日志
 // 不同于zap内部可变参数逻辑,该可变参数是用于,字符串格式化的
 func (l *Logger) Info(msg string, vs ...any) {
-	defer l.logger.Sync()
 	if len(vs) == 0 {
 		l.logger.Info(msg)
 		return
@@ -84,7 +82,6 @@ func (l *Logger) Info(msg string, vs ...any) {
 // Warn 格式化打印警告级别日志
 // 不同于zap内部可变参数逻辑,该可变参数是用于,字符串格式化的
 func (l *Logger) Warn(msg string, vs ...any) {
-	defer l.logger.Sync()
 	if len(vs) == 0 {
 		l.logger.Warn(msg)
 		return
@@ -102,7 +99,6 @@ func (l *Logger) Error(vs ...any) {
 		return
 	}
 
-	defer l.logger.Sync()
 	err, ok := vs[0].(error)
 	if ok {
 		if len(vs) == 1 {
@@ -209,3 +205,9 @@ func (l *Logger) flush() {
 		zap.AddCaller(),
 	).Sugar()
 }
+
+func (l *Logger) clone() *Logger {
+	newL := &Logger{cores: l.cores, lv: l.lv}
+	newL.flush()
+	return newL
+}