zap日志使用
package main
import (
"encoding/json"
"fmt"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func initLogger (logpath string,loglevel string) *zap.Logger {
hook := lumberjack.Logger{
Filename: logpath, //日志文件路徑
MaxSize: 128, //最大字節
MaxAge: 30,
MaxBackups: 7,
Compress: true,
}
w := zapcore.AddSync(&hook)
// 設置日志級別,debug可以打印出info,debug,warn;info級別可以打印warn,info;warn只能打印warn
// debug->info->warn->error
var level zapcore.Level
switch loglevel {
case "debug":
level = zap.DebugLevel
case "info":
level= zap.InfoLevel
case "error":
level = zap.ErrorLevel
default:
level = zap.InfoLevel
}
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
core := zapcore.NewCore(
zapcore.NewConsoleEncoder(encoderConfig),
w,
level,
)
logger := zap.New(core)
logger.Info("DefaultLogger init success")
return logger
}
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main(){
t:= &Person{
Name: "zhangsan",
Age: 21,
}
data,err := json.Marshal(t)
if err!=nil {
fmt.Println("marshal is failed,err:",err)
}
// 歷史記錄日志名字為:all-2018-11-15T07-45-51.763.log,服務重新啟動,日志會追加,不會刪除
logger := initLogger("./all.log","debug")
for i:=0;i<6;i++{
//結構化日志輸出,即字段和消息
//字段用來結構化輸出錯誤相關的上下文環境,而消息簡明扼要的闡述錯誤本身
logger.Info(fmt.Sprint("test log",i),zap.Int("line",47))
logger.Debug(fmt.Sprint("debug log",i),zap.ByteString("level",data))
logger.Info(fmt.Sprint("Info log",i),zap.String("level",`{"a":"4","b":"5"}`))
logger.Warn(fmt.Sprint("Info log ", i), zap.String("level", `{"a":"7","b":"8"}`))
// 用戶不存在的錯誤消息
logger.Error("User does not exist",zap.String("Name",t.Name))
}
//supgar的使用,不推薦,適合簡單使用
sugar := logger.Sugar()
sugar.Debugf("hello world : %s","zap-sugar")
}
示例代碼二
package logger
import (
"os"
"time"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
lumberjackv2 "gopkg.in/natefinch/lumberjack.v2"
)
const (
Console = "console"
File = "file"
)
var (
Leavel = zap.DebugLevel
Target = Console
)
var (
Logger *zap.Logger
Sugar *zap.SugaredLogger
)
func NewEncoderConfig() zapcore.EncoderConfig {
return zapcore.EncoderConfig{
// Keys can be anything except the empty string.
TimeKey: "T",
LevelKey: "L",
NameKey: "N",
CallerKey: "C",
MessageKey: "M",
StacktraceKey: "S",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.CapitalLevelEncoder,
EncodeTime: TimeEncoder,
EncodeDuration: zapcore.StringDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
}
func TimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}
func init() {
w := zapcore.AddSync(&lumberjackv2.Logger{
Filename: "log/im.log",
MaxSize: 1024, // megabytes
MaxBackups: 10,
MaxAge: 7, // days
})
var writeSyncer zapcore.WriteSyncer
if Target == Console {
writeSyncer = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout))
}
if Target == File {
writeSyncer = zapcore.NewMultiWriteSyncer(w)
}
core := zapcore.NewCore(
zapcore.NewConsoleEncoder(NewEncoderConfig()),
writeSyncer,
Leavel,
)
Logger = zap.New(core, zap.AddCaller())
Sugar = Logger.Sugar()
}
示例代碼三
package logger
import (
"github.com/astaxie/beego"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
)
// 初始化zaplogger日志庫
var MyLogger *zap.Logger
func initLogger(logpath string) *zap.Logger {
hook := lumberjack.Logger{
Filename: logpath, // 日志文件路徑
MaxSize: 128, // 每個日志文件保存的最大尺寸 單位:M
MaxBackups: 30, // 日志文件最多保存多少個備份
MaxAge: 7, // 文件最多保存多少天
Compress: true, // 是否壓縮
}
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.ShortCallerEncoder, // 短路徑編碼器
EncodeName: zapcore.FullNameEncoder,
}
// 設置日志級別
atomicLevel := zap.NewAtomicLevel()
atomicLevel.SetLevel(zap.DebugLevel)
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig), // 編碼器配置
zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)), // 打印到控制台和文件
atomicLevel, // 日志級別
)
// 開啟開發模式,堆棧跟蹤
caller := zap.AddCaller()
// 開啟文件及行號
development := zap.Development()
// 設置初始化字段
filed := zap.Fields(zap.String("serviceName", "webgo"))
// 構造日志
logger := zap.New(core, caller, development, filed)
logger.Info("log 初始化成功")
return logger
}
// 初始化日志
func init() {
logPath := beego.AppConfig.String("LogPath")
MyLogger = initLogger(logPath)
}