6-2.高性能日志库zap
目录
1 高性能日志库zap
-
- 安装和基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// go get -u go.uber.org/zap package main import ( "go.uber.org/zap" ) func main() { logger, _ := zap.NewProduction() defer logger.Sync() // flushes buffer, if any url := "https://imooc.com" sugar := logger.Sugar() sugar.Infow("failed to fetch URL", // Structured context as loosely typed key-value pairs. "url", url, "attempt", 3, ) sugar.Infof("Failed to fetch URL: %s", url) }
Zap提供了两种类型的日志记录器—
Sugared Logger
和Logger
。在性能很好但不是很关键的上下文中,使用
SugaredLogger
。它比其他结构化日志记录包快4-10倍,并且支持结构化和printf风格的日志记录。在每一微秒和每一次内存分配都很重要的上下文中,使用
Logger
。它甚至比SugaredLogger
更快,内存分配次数也更少,但它只支持强类型的结构化日志记录 -
- 写入日志文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
package main import ( "go.uber.org/zap" "time" ) func NewLogger() (*zap.Logger, error) { cfg := zap.NewProductionConfig() cfg.OutputPaths = []string{ "./myproject.log", // 输出到文件 "stdout",// 输出到控制台 "stderr",//输出到控制台err } return cfg.Build() } func main() { //logger, _ := zap.NewProduction() logger, err := NewLogger() if err != nil { panic(err) //panic("初始化logger失败") } su := logger.Sugar() defer su.Sync() url := "https://imooc.com" su.Info("failed to fetch URL", // Structured context as strongly typed Field values. zap.String("url", url), zap.Int("attempt", 3), zap.Duration("backoff", time.Second), ) }
-
高级用法
1 2 3 4 5 6 7 8 9 10 11 12
/* 1.S()可以获取一个全局的 sugar,可以让我们已设置一个全局的1oger, 而且S()是安全的 2.日志是分级别的, debug,info,Warn, error, fetal 3.zap.S()函数和zap.L()函数很有用 -- S()= sugure --L() = logger() */ logger, _ := zap.NewDevelopment() zap.ReplaceGlobals(logger) // 初始化router Router := initialize.Routers() zap.S().Info("启动服务端 %d", port) zap.S().Panic("启动失败:", err.Error())
2 案例1-gin
|
|
3 案例2
-
logcore
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
/** * 获取日志 * filePath 日志文件路径 * level 日志级别 * maxSize 每个日志文件保存的最大尺寸 单位:M * maxBackups 日志文件最多保存多少个备份 * maxAge 文件最多保存多少天 * compress 是否压缩 * serviceName 服务名 */ func NewLogger(filePath string, level zapcore.Level, maxSize int, maxBackups int, maxAge int, compress bool, serviceName string) *zap.Logger { core := newCore(filePath, level, maxSize, maxBackups, maxAge, compress) return zap.New(core, zap.AddCaller(), zap.Development(), zap.Fields(zap.String("serviceName", serviceName))) } /** * zapcore构造 */ func newCore(filePath string, level zapcore.Level, maxSize int, maxBackups int, maxAge int, compress bool) zapcore.Core { //日志文件路径配置2 hook := lumberjack.Logger{ Filename: filePath, // 日志文件路径 MaxSize: maxSize, // 每个日志文件保存的最大尺寸 单位:M MaxBackups: maxBackups, // 日志文件最多保存多少个备份 MaxAge: maxAge, // 文件最多保存多少天 Compress: compress, // 是否压缩 } // 设置日志级别 atomicLevel := zap.NewAtomicLevel() atomicLevel.SetLevel(level) //公用编码器 encoderConfig := zapcore.EncoderConfig{ TimeKey: "time", LevelKey: "level", NameKey: "logger", CallerKey: "linenum", MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.LowercaseLevelEncoder, // 小写编码器 EncodeTime: zapcore.ISO8601TimeEncoder, // ISO8601 UTC 时间格式 EncodeDuration: zapcore.SecondsDurationEncoder, // EncodeCaller: zapcore.FullCallerEncoder, // 全路径编码器 EncodeName: zapcore.FullNameEncoder, } return zapcore.NewCore( zapcore.NewJSONEncoder(encoderConfig), // 编码器配置 zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)), // 打印到控制台和文件 atomicLevel, // 日志级别 ) }
-
log
1 2 3 4 5 6 7 8
var MainLogger *zap.Logger var GatewayLogger *zap.Logger func init() { MainLogger = NewLogger("./logs/main.log", zapcore.InfoLevel, 128, 30, 7, true, "Main") GatewayLogger = NewLogger("./logs/gateway.log", zapcore.DebugLevel, 128, 30, 7, true, "Gateway") }
-
app
1 2 3 4 5 6 7
func main() { fmt.Println("init main") log.MainLogger.Debug("hello main Debug") log.MainLogger.Info("hello main Info") log.GatewayLogger.Debug("Hi Gateway Im Debug") log.GatewayLogger.Info("Hi Gateway Im Info") }
Buy me a coffee~


收录于 合集・go高级 42