基于douyu的xlog
依赖
github.com/douyu/jupiter/pkg/xlog
go.uber.org/zap
gopkg.in/natefinch/lumberjack.v2
log相关结构体
types/log.go
type Log struct {
Env string `toml:"env"`
InfoLogFileName string `toml:"infoLogFileName"`
ErrorLogFileName string `toml:"errorLogFileName"`
MaxSize uint32 `toml:"maxSize"`
MaxBackups uint32 `toml:"maxBackups"`
MaxAge uint32 `toml:"maxAge"`
Dir string `toml:"dir"`
Level string `toml:"level"`
}
配置文件
config/config.toml
[log]
env = "dev"
infoLogFileName = "info.log"
errorLogFileName = "error.log"
maxSize = 50
maxBackups = 20
maxAge = 7
dir = "./logs/"
level = "info"
解析toml配置文件
config/config.go
package config
import (
"your-system/types"
"github.com/BurntSushi/toml"
)
var Conf Config
// Config 定义一个结构体接收toml所有配置
type Config struct {
Log types.Log
}
func ConfParse() {
configPath := "./config/config.toml"
if _, err := toml.DecodeFile(configPath, &Conf); err != nil {
xlog.Error("get conf failed", xlog.Any("err", err))
panic(err)
}
}
xlog 初始化
log/log.go
package log
import (
"fmt"
"os"
"your-system/types"
"strings"
"time"
"github.com/douyu/jupiter/pkg/xlog"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
func InitLogger(log *types.Log) {
// 获取 info、error日志文件的io.Writer 抽象 getFileLogWriter() 在下方实现
infoWriteSyncer := getLogWriter(log, log.InfoLogFileName)
errorWriteSyncer := getLogWriter(log, log.ErrorLogFileName)
encoder := getEncoder()
level := getLevel(log.Level)
// 初始化 cores 切片
var cores []zapcore.Core
// 如果不是生产环境,添加控制台输出
fmt.Println(strings.ToLower(log.Env))
if strings.ToLower(log.Env) != "prd" {
cores = append(cores,
zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), zapcore.DebugLevel), // 打印到控制台
)
}
cores = append(cores,
// 向文件写日志, 生产环境不往控制台输出,生产环境记得改成Info
zapcore.NewCore(encoder, zapcore.AddSync(infoWriteSyncer), level),
zapcore.NewCore(encoder, zapcore.AddSync(errorWriteSyncer), zapcore.ErrorLevel),
)
core := zapcore.NewTee(cores...)
logger := zap.New(core, zap.AddCaller())
xlog.SetDefault(logger)
}
func getLogWriter(log *types.Log, logFileName string) zapcore.WriteSyncer {
lumberJackLogger := &lumberjack.Logger{
Filename: fmt.Sprintf("%s%s", log.Dir, logFileName),
MaxSize: int(log.MaxSize),
MaxBackups: int(log.MaxBackups),
MaxAge: int(log.MaxAge),
LocalTime: true,
Compress: false, //是否压缩/归档旧文件
}
syncFile := zapcore.AddSync(lumberJackLogger) // 打印到文件
return zapcore.NewMultiWriteSyncer(syncFile)
}
// 负责设置 encoding 的日志格式
func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
// 序列化时间。eg: 2006-01-02 15:04:05.00
encoderConfig.EncodeTime = cEncodeTime
encoderConfig.TimeKey = "time"
encoderConfig.EncodeDuration = zapcore.SecondsDurationEncoder
// 将Level序列化为全大写字符串。例如,将info level序列化为INFO。
encoderConfig.EncodeLevel = cEncodeLevel
// 以 package/file:行 的格式 序列化调用程序,从完整路径中删除除最后一个目录外的所有目录。
encoderConfig.EncodeCaller = cEncodeCaller
return zapcore.NewConsoleEncoder(encoderConfig)
}
// cEncodeLevel 自定义日志级别显示
func cEncodeLevel(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
zapcore.CapitalLevelEncoder(level, enc)
}
// cEncodeTime 自定义时间格式显示
func cEncodeTime(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString("[" + t.Format("2006-01-02 15:04:05.000") + "]")
}
// cEncodeCaller 自定义行号显示
func cEncodeCaller(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString("[" + caller.TrimmedPath() + "]")
}
func getLevel(level string) zapcore.Level {
switch strings.ToLower(level) {
case "debug":
return zapcore.DebugLevel
case "info":
return zapcore.InfoLevel
case "warn":
return zapcore.WarnLevel
case "error":
return zapcore.ErrorLevel
case "panic":
return zapcore.PanicLevel
case "fata":
return zapcore.FatalLevel
default:
return zapcore.DebugLevel
}
}
主入口文件
main.go
package main
import (
"your-system/config"
"strings"
"time"
"github.com/douyu/jupiter/pkg/xlog"
)
func main(){
config.ConfParse()
log.InitLogger(&config.Conf.Log)
object :=
xlog.Error("ErrorMsg ", xlog.Any("object", config.Conf.Log), xlog.String("string", "123123"))
}
在其他地方使用的时候,只需要 import “github.com/douyu/jupiter/pkg/xlog”,使用类似 xlog.Error("ErrorMsg ", xlog.Any(“object”, config.Conf.Log), xlog.String(“string”, “123123”)) 语法即可