玩转高性能日志库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) } 输出 ...

October 9, 2024 · 2 min

玩转高性能日志库ZAP(3)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 引言 前几天有朋友问我,zap库是否支持同时打印到多个目标地址,比如1份打印到文件,1份到控制台,1份打印到kafka中。这是所有日志库都会支持的功能,zap当然也不例外。 示例 package main import ( "io/ioutil" "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack" "os" ) func main(){ // First, define our level-handling logic. // 仅打印Error级别以上的日志 highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl >= zapcore.ErrorLevel }) // 打印所有级别的日志 lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl >= zapcore.DebugLevel }) hook := lumberjack.Logger{ Filename: "/tmp/abc.log", MaxSize: 1024, // megabytes MaxBackups: 3, MaxAge: 7, //days Compress: true, // disabled by default } topicErrors := zapcore.AddSync(ioutil.Discard) fileWriter := zapcore.AddSync(&hook) // High-priority output should also go to standard error, and low-priority // output should also go to standard out. consoleDebugging := zapcore.Lock(os.Stdout) // Optimize the Kafka output for machine consumption and the console output // for human operators. kafkaEncoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) // Join the outputs, encoders, and level-handling functions into // zapcore.Cores, then tee the four cores together. core := zapcore.NewTee( // 打印在kafka topic中(伪造的case) zapcore.NewCore(kafkaEncoder, topicErrors, highPriority), // 打印在控制台 zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority), // 打印在文件中 zapcore.NewCore(consoleEncoder, fileWriter, highPriority), ) // From a zapcore.Core, it's easy to construct a Logger. logger := zap.New(core) defer logger.Sync() logger.Info("constructed a info logger", zap.Int("test", 1)) logger.Error("constructed a error logger", zap.Int("test", 2)) } 输出结果 文件中 ...

September 17, 2018 · 2 min