玩转高性能日志库ZAP (7)-标识
1.前言
在Java中我们常常会这样使用日志
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class Main {
final static Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("info, hello {}", "slf4j");
log.error("error");
}
}
输出
6:30:03.350 [main] INFO Main - info, hello slf4j
16:30:03.356 [main] ERROR Main - error
这里在每条日志中都有类名,可以很容易从文件中过滤出这个类相关的日志。
2.zap中使用name标识
zap中的玩法
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"time"
)
func main() {
config := zap.NewProductionConfig()
config.Encoding = "console"
config.EncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
logger, _ := config.Build()
defer logger.Sync()
// 输出该条日志在代码文件中的行号
logger = logger.WithOptions(zap.AddCaller())
logger.Info("failed to fetch URL",
zap.Int("attempt", 3),
zap.Duration("backoff", time.Second),
)
go func() { // worker1
// 携带name标识
logger1 := logger.Named("worker1")
for {
time.Sleep(time.Millisecond * 200)
logger1.Info("hello1")
}
}()
go func() { // worker2
logger2 := logger.Named("worker2")
for {
time.Sleep(time.Millisecond * 200)
logger2.Info("hello2")
}
}()
time.Sleep(3 * time.Second)
}
输出
每条日志都输出了logger的Name以及该条日志在代码文件中的行号
- 输出日志在代码文件中的行号,可以帮助快速定位问题
- 如果服务中包含多个在后台运行的协程(worker),萌叔建议给logger命名,并输出到日志中
3.zap中处理重复的Field
package main
import (
"go.uber.org/zap"
"time"
)
func main() {
config := zap.NewProductionConfig()
config.Encoding = "console"
logger, _ := config.Build()
defer logger.Sync()
logger = logger.WithOptions(zap.AddCaller())
logger.Info("failed to fetch URL",
zap.Int("attempt", 3),
zap.Duration("backoff", time.Second),
)
logger1 := logger.With(zap.String("duplicateKey", "duplicateValue"))
for i := 0; i < 5; i++ {
logger1.Info("record", zap.Int("i", i))
}
logger1.Info("I will exit.")
time.Sleep(10 * time.Second)
}
上面的程序中,有个特殊的Field
zap.String("duplicateKey", "duplicateValue")
需要在每条日志中携带, 那么你可以使用logger.With
输出
1.7284685624361799e+09 info myotp2/main.go:14 failed to fetch URL {"attempt": 3, "backoff": 1}
1.728468562436277e+09 info myotp2/main.go:22 record {"duplicateKey": "duplicateValue", "i": 0}
1.7284685624362822e+09 info myotp2/main.go:22 record {"duplicateKey": "duplicateValue", "i": 1}
1.728468562436285e+09 info myotp2/main.go:22 record {"duplicateKey": "duplicateValue", "i": 2}
1.728468562436287e+09 info myotp2/main.go:22 record {"duplicateKey": "duplicateValue", "i": 3}
1.728468562436289e+09 info myotp2/main.go:22 record {"duplicateKey": "duplicateValue", "i": 4}
1.728468562436291e+09 info myotp2/main.go:24 I will exit. {"duplicateKey": "duplicateValue"}
作者: vearne
文章标题: 玩转高性能日志库ZAP (7)-标识
发表时间: 2024年10月9日
文章链接:https://vearne.cc/archives/40167
版权说明: CC BY-NC-ND 4.0 DEED