簡単な分析golang zapログライブラリの使用に深化する(ファイルカット、サブレベル記憶、グローバル使用などを含む)
ログ処理には常に以下のいくつかの要求があります。
1、異なるレベルのログを異なるログファイルに出力します。
2、ログファイルはファイルサイズまたは日付に従って切断して保存し、単一のログファイルが大きすぎないようにする。
3、ログの使用は簡単で便利で、一回で全体の使用を定義します。
Uber-goを使ったZap Loggerをお勧めします。大神李文周大ブログではすでに非常に明確にしています。李先生のブログを参考にしてください。
https://www.liwenzhou.com/posts/Go/zap/
問題二と問題三は補充説明が必要です。
一、ログはレベル別にファイルカットして保存する。
1.1まず二つの判定ログレベルのインターフェースを実現する。
一つのloggerを定義してから、プロジェクト全体が即用であることを望んでいます。各ファイルの初期化は不要です。go関数の静的関数を使って実現します。
2.1 loggerパッケージを定義する
2.2外部から直接アクセスできる関数を定義する
注意関数の頭文字は大文字にします。
3.1ファイルディレクトリ
3.2 lgo.goソース
以上は、ご紹介したgolang zapログライブラリの使用(ファイルカット、サブレベルの記憶、グローバル使用などを含む)です。皆様のご協力をお願いします。
1、異なるレベルのログを異なるログファイルに出力します。
2、ログファイルはファイルサイズまたは日付に従って切断して保存し、単一のログファイルが大きすぎないようにする。
3、ログの使用は簡単で便利で、一回で全体の使用を定義します。
Uber-goを使ったZap Loggerをお勧めします。大神李文周大ブログではすでに非常に明確にしています。李先生のブログを参考にしてください。
https://www.liwenzhou.com/posts/Go/zap/
問題二と問題三は補充説明が必要です。
一、ログはレベル別にファイルカットして保存する。
1.1まず二つの判定ログレベルのインターフェースを実現する。
infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.InfoLevel
})
errorLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.ErrorLevel
})
1.2 info、errorログファイルのio.Writerを取得する
infoWriter := getWriter("./logs/demo_info.log")
errorWriter := getWriter("./logs/demo_error.log")
ファイル名は、システム時間に合わせてアクセスできます。
func getWriter(filename string) io.Writer {
// rotatelogs Logger demo.log.YYmmddHH
// demo.log
// 7 , 1 ( )
hook, err := rotatelogs.New(
strings.Replace(filename, ".log", "", -1)+"-%Y%m%d%H.log", // go format
//rotatelogs.WithLinkName(filename),
//rotatelogs.WithMaxAge(time.Hour*24*7),
//rotatelogs.WithRotationTime(time.Hour),
)
if err != nil {
panic(err)
}
return hook
}
1.3最後に具体的なロギングを作成する
core := zapcore.NewTee(
zapcore.NewCore(encoder, zapcore.AddSync(infoWriter), infoLevel),
zapcore.NewCore(encoder, zapcore.AddSync(errorWriter), errorLevel),
)
1.4ロゴを作成する
log := zap.New(core, zap.AddCaller())
errorLogger = log.Sugar()
二、ログ定義のグローバル使用一つのloggerを定義してから、プロジェクト全体が即用であることを望んでいます。各ファイルの初期化は不要です。go関数の静的関数を使って実現します。
2.1 loggerパッケージを定義する
2.2外部から直接アクセスできる関数を定義する
注意関数の頭文字は大文字にします。
func Debug(args ...interface{}) {
errorLogger.Debug(args...)
}
func Debugf(template string, args ...interface{}) {
errorLogger.Debugf(template, args...)
}
func Info(args ...interface{}) {
errorLogger.Info(args...)
}
func Infof(template string, args ...interface{}) {
errorLogger.Infof(template, args...)
}
func Warn(args ...interface{}) {
errorLogger.Warn(args...)
}
func Warnf(template string, args ...interface{}) {
errorLogger.Warnf(template, args...)
}
func Error(args ...interface{}) {
errorLogger.Error(args...)
}
func Errorf(template string, args ...interface{}) {
errorLogger.Errorf(template, args...)
}
func DPanic(args ...interface{}) {
errorLogger.DPanic(args...)
}
func DPanicf(template string, args ...interface{}) {
errorLogger.DPanicf(template, args...)
}
2.3使用するところに直接にインクルードを導入すれば、そのまま使用できます。logger.Infof("create token succ , token=%v", token)
三、ソースコード3.1ファイルディレクトリ
3.2 lgo.goソース
package logger
import (
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"io"
"strings"
"time"
)
var errorLogger *zap.SugaredLogger
func init(){
// , zap
encoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
MessageKey: "msg",
LevelKey: "level",
EncodeLevel: zapcore.CapitalLevelEncoder,
TimeKey: "ts",
EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format("2006-01-02 15:04:05"))
},
CallerKey: "file",
EncodeCaller: zapcore.ShortCallerEncoder,
EncodeDuration: func(d time.Duration, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendInt64(int64(d) / 1000000)
},
})
// interface
infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.InfoLevel
})
errorLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.ErrorLevel
})
// info、error io.Writer getWriter()
infoWriter := getWriter("./logs/demo_info.log")
errorWriter := getWriter("./logs/demo_error.log")
// Logger
core := zapcore.NewTee(
zapcore.NewCore(encoder, zapcore.AddSync(infoWriter), infoLevel),
zapcore.NewCore(encoder, zapcore.AddSync(errorWriter), errorLevel),
)
log := zap.New(core, zap.AddCaller()) // zap.AddCaller() ,
errorLogger = log.Sugar()
}
func getWriter(filename string) io.Writer {
// rotatelogs Logger demo.log.YYmmddHH
// demo.log
// 7 , 1 ( )
hook, err := rotatelogs.New(
strings.Replace(filename, ".log", "", -1)+"-%Y%m%d%H.log", // go format
//rotatelogs.WithLinkName(filename),
//rotatelogs.WithMaxAge(time.Hour*24*7),
//rotatelogs.WithRotationTime(time.Hour),
)
if err != nil {
panic(err)
}
return hook
}
func Debug(args ...interface{}) {
errorLogger.Debug(args...)
}
func Debugf(template string, args ...interface{}) {
errorLogger.Debugf(template, args...)
}
func Info(args ...interface{}) {
errorLogger.Info(args...)
}
func Infof(template string, args ...interface{}) {
errorLogger.Infof(template, args...)
}
func Warn(args ...interface{}) {
errorLogger.Warn(args...)
}
func Warnf(template string, args ...interface{}) {
errorLogger.Warnf(template, args...)
}
func Error(args ...interface{}) {
errorLogger.Error(args...)
}
func Errorf(template string, args ...interface{}) {
errorLogger.Errorf(template, args...)
}
func DPanic(args ...interface{}) {
errorLogger.DPanic(args...)
}
func DPanicf(template string, args ...interface{}) {
errorLogger.DPanicf(template, args...)
}
func Panic(args ...interface{}) {
errorLogger.Panic(args...)
}
func Panicf(template string, args ...interface{}) {
errorLogger.Panicf(template, args...)
}
func Fatal(args ...interface{}) {
errorLogger.Fatal(args...)
}
func Fatalf(template string, args ...interface{}) {
errorLogger.Fatalf(template, args...)
}
3.3 main関数使用
import (
"flag"
"goAuth/logger"
"goAuth/util"
"os"
)
func main() {
createAndCheckToken()
logger.Infof("in main args:%v", os.Args)
logger.Errorf("eerror %v", "error")
flag.Parse()
logger.Infof("env is %v", *env)
config := util.InitConfig( "./config/" + *env + ".conf")
ip := config["ip"]
port := config["port"]
envConfig := config["env"]
logger.Infof("ip=%v, port=%v, env=%v", ip, port, envConfig)
}
締め括りをつける以上は、ご紹介したgolang zapログライブラリの使用(ファイルカット、サブレベルの記憶、グローバル使用などを含む)です。皆様のご協力をお願いします。