前言
zap 是 uber 開源的一個日志記錄的包, uber 在 go 的領域建樹頗多, zap 更是優秀, 相比於自帶的 log ,他有更多的功能, 當然, 最顯眼的還是他很快, 本文介紹 zap 模塊的基本使用
正文
zap的使用由 編碼器 和 初始化 組成, 編碼器表示輸出的格式, DEMO如下(使用默認的編碼器)
package tool
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// Log zapLog對象
var Log *zap.Logger
Log, _ = zap.NewProduction()
使用方法為直接調用生成的 Log, 比如
_, err := tools.DB.Exec(sqlStr, formPassWord, time.Now(), formPhone)
if err != nil {
tools.Log.Error("1002", zap.Error(err)) // log
tools.FormatError(c, 1002, "error")
return
}
將日志保存在本地
如果項目有日志服務進行日志收集那么到這里就結束了, 如果需要將日志寫在本地你還需要看下去
我們使用第三方包來達到這個效果
該包可以自己進行日志的切割, 避免日志推擠過多, 當然你不需要日志切割等高級功能的話你完全可以直接使用 os.Create 來適配
結合 zap 使用如下
package tools
import (
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// Log zapLog對象
var Log *zap.Logger
// 日志切割設置
func getLogWriter() zapcore.WriteSyncer {
lumberJackLogger := &lumberjack.Logger{
Filename: "api.log", // 日志文件位置
MaxSize: 10, // 日志文件最大大小(MB)
MaxBackups: 5, // 保留舊文件最大數量
MaxAge: 30, // 保留舊文件最長天數
Compress: false, // 是否壓縮舊文件
}
return zapcore.AddSync(lumberJackLogger)
}
// 編碼器
func getEncoder() zapcore.Encoder {
// 使用默認的JSON編碼
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
return zapcore.NewJSONEncoder(encoderConfig)
}
// InitLogger 初始化Logger
func InitLogger() {
writeSyncer := getLogWriter()
encoder := getEncoder()
core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)
Log = zap.New(core, zap.AddCaller())
}
使用方法與上方一致
Log.Error 代表生成一條 Error 的log, 參數一是 msg 內容, 這個是自定義的, 根據團隊的規范來, 參數二是 err 信息, 使用 zap.Error 包裝可生成額外的信息比如報錯的路徑/文件/行 等信息, 輸出的日志類似
{"level":"ERROR","ts":"2020-04-19T12:38:14.587+0800","caller":"property/view.go:464","msg":"1002","error":"Error 1054: Unknown column 'propertyid' in 'on clause'"}