代码拉取完成,页面将自动刷新
package logger
import (
"fmt"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"os"
"time"
)
// log
var log *zap.SugaredLogger
var levelMap = map[string]zapcore.Level{
"debug": zapcore.DebugLevel,
"info": zapcore.InfoLevel,
"warn": zapcore.WarnLevel,
"error": zapcore.ErrorLevel,
"panic": zapcore.PanicLevel,
"fatal": zapcore.FatalLevel,
}
/**
* 初始化日志
* filename 日志文件路径
* level 日志级别
* maxSize 每个日志文件保存的最大尺寸 单位:M
* maxBackups 日志文件最多保存多少个备份
* maxAge 文件最多保存多少天
* compress 是否压缩
* serviceName 服务名
* 由于zap不具备日志切割功能, 这里使用lumberjack配合
*/
func InitLogger() {
now := time.Now()
filename := fmt.Sprintf("%s/%04d-%02d-%02d.log", "runtime/logs", now.Year(), now.Month(), now.Day())
level := getLoggerLevel("debug")
// 日志切割
hook := &lumberjack.Logger{
Filename: filename,
MaxSize: 1 << 30, // 1G
MaxAge: 7, // 文件最多保存多少天
MaxBackups: 30, // 备份数
Compress: true, // 是否压缩
}
defer hook.Close()
// 配置
enConfig := zap.NewProductionEncoderConfig()
enConfig.TimeKey = "time" // 时间字段展示名字
enConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05") // 时间格式
enConfig.EncodeLevel = zapcore.CapitalLevelEncoder // 大写编码器
enConfig.EncodeCaller = zapcore.ShortCallerEncoder // 短路径编码器(相对路径+行号)
// 编码器配置
enCoder := zapcore.NewJSONEncoder(enConfig) // json格式
//enCoder := zapcore.NewConsoleEncoder(enConfig) // 文本格式
// 构造日志
core := zapcore.NewCore(
enCoder,
zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(hook)), // 输出到控制台和文件
zap.NewAtomicLevelAt(level),
)
caller := zap.AddCaller() // 开启文件及行号
logInstance := zap.New(core, caller, zap.AddCallerSkip(1))
log = logInstance.Sugar()
log.Debug("初始化日志完成")
return
}
func getLoggerLevel(lvl string) zapcore.Level {
if level, ok := levelMap[lvl]; ok {
return level
}
return zapcore.InfoLevel
}
// 简单日志记录
func Debug(args ...interface{}) {
log.Debug(args...)
}
func Info(args ...interface{}) {
log.Info(args...)
}
func Warn(args ...interface{}) {
log.Warn(args...)
}
func Error(args ...interface{}) {
log.Error(args...)
}
func Panic(args ...interface{}) {
log.Panic(args...)
}
func Fatal(args ...interface{}) {
log.Fatal(args...)
}
// 多参数(k v形式)日志记录
// logger.Infow("aaaaaa",
// zap.Int("status", 200),
// zap.String("method", "GET"),
// )
func Debugw(msg string, keysAndValues ...interface{}) {
log.Debugw(msg, keysAndValues...)
}
func Infow(msg string, keysAndValues ...interface{}) {
log.Infow(msg, keysAndValues...)
}
func Warnw(msg string, keysAndValues ...interface{}) {
log.Warnw(msg, keysAndValues...)
}
func Errorw(msg string, keysAndValues ...interface{}) {
log.Errorw(msg, keysAndValues...)
}
func Panicw(msg string, keysAndValues ...interface{}) {
log.Panicw(msg, keysAndValues...)
}
func Fatalw(msg string, keysAndValues ...interface{}) {
log.Fatalw(msg, keysAndValues...)
}
// 带格式化的日志记录
// logger.Infof("hello %s", "azu")
func Debugf(template string, args ...interface{}) {
log.Debugf(template, args...)
}
func Infof(template string, args ...interface{}) {
log.Infof(template, args...)
}
func Warnf(template string, args ...interface{}) {
log.Warnf(template, args...)
}
func Errorf(template string, args ...interface{}) {
log.Errorf(template, args...)
}
func Panicf(template string, args ...interface{}) {
log.Panicf(template, args...)
}
func Fatalf(template string, args ...interface{}) {
log.Fatalf(template, args...)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。