150 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Package logger...
 | |
| //
 | |
| // Description : logger 日志文件
 | |
| //
 | |
| // Author : go_developer@163.com<白茶清欢>
 | |
| //
 | |
| // Date : 2021-01-02 5:04 下午
 | |
| package logger
 | |
| 
 | |
| import (
 | |
| 	"io"
 | |
| 	"os"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/pkg/errors"
 | |
| 
 | |
| 	"go.uber.org/zap"
 | |
| 
 | |
| 	"go.uber.org/zap/zapcore"
 | |
| 
 | |
| 	rotatelogs "github.com/lestrrat-go/file-rotatelogs"
 | |
| )
 | |
| 
 | |
| // NewLogger 获取日志实例
 | |
| func NewLogger(inputLoggerLevel LogLevel, splitConfig *RotateLogConfig, optionFunc ...SetLoggerOptionFunc) (*zap.Logger, error) {
 | |
| 	if nil == splitConfig {
 | |
| 		return nil, errors.New("未配置日志切割规则")
 | |
| 	}
 | |
| 
 | |
| 	loggerLevel := inputLevel2ZapLevel(inputLoggerLevel)
 | |
| 
 | |
| 	o := &OptionLogger{}
 | |
| 
 | |
| 	for _, f := range optionFunc {
 | |
| 		f(o)
 | |
| 	}
 | |
| 
 | |
| 	if nil == o.Encoder {
 | |
| 		o.Encoder = GetEncoder()
 | |
| 	}
 | |
| 	loggerLevelDeal := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
 | |
| 		return lvl >= loggerLevel
 | |
| 	})
 | |
| 	l := &Logger{
 | |
| 		splitConfig: splitConfig,
 | |
| 		encoder:     o.Encoder,
 | |
| 	}
 | |
| 	var (
 | |
| 		err          error
 | |
| 		loggerWriter io.Writer
 | |
| 	)
 | |
| 	// 获取 日志实现
 | |
| 	if loggerWriter, err = l.getWriter(); nil != err {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	fileHandlerList := []zapcore.Core{
 | |
| 		zapcore.NewCore(o.Encoder, zapcore.AddSync(loggerWriter), loggerLevelDeal), // 指定的日志输出位置
 | |
| 		zapcore.NewCore(o.Encoder, zapcore.AddSync(&wsWriter{}), loggerLevelDeal),  // 设置ws日志输出
 | |
| 	}
 | |
| 
 | |
| 	// 设置控制台输出
 | |
| 	if o.ConsoleOutput {
 | |
| 		fileHandlerList = append(fileHandlerList, zapcore.NewCore(o.Encoder, zapcore.AddSync(os.Stdout), loggerLevelDeal))
 | |
| 	}
 | |
| 
 | |
| 	// 设置zinc日志输出
 | |
| 	if nil != o.ZincCollectConfig {
 | |
| 		fileHandlerList = append(fileHandlerList, zapcore.NewCore(o.Encoder, zapcore.AddSync(NewZincLogConnect(o.ZincCollectConfig)), loggerLevelDeal))
 | |
| 	}
 | |
| 
 | |
| 	// 最后创建具体的Logger
 | |
| 	core := zapcore.NewTee(fileHandlerList...)
 | |
| 
 | |
| 	// 需要传入 zap.AddCaller() 才会显示打日志点的文件名和行数, 跳过一行可以直接显示业务代码行号,否则显示日志包行号
 | |
| 	logConfList := make([]zap.Option, 0)
 | |
| 	if o.WithCaller {
 | |
| 		logConfList = append(logConfList, zap.AddCaller(), zap.AddCallerSkip(o.WithCallerSkip))
 | |
| 	}
 | |
| 	log := zap.New(core, logConfList...)
 | |
| 	return log, nil
 | |
| }
 | |
| 
 | |
| // NewConsoleLogger 获取控制台输出的日志实例
 | |
| func NewConsoleLogger(loggerLevel zapcore.Level, optionFunc ...SetLoggerOptionFunc) (*zap.Logger, error) {
 | |
| 	o := &OptionLogger{}
 | |
| 
 | |
| 	for _, f := range optionFunc {
 | |
| 		f(o)
 | |
| 	}
 | |
| 	if nil == o.Encoder {
 | |
| 		o.Encoder = GetEncoder()
 | |
| 	}
 | |
| 	loggerLevelDeal := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
 | |
| 		return lvl >= loggerLevel
 | |
| 	})
 | |
| 	fileHandlerList := []zapcore.Core{
 | |
| 		zapcore.NewCore(o.Encoder, zapcore.AddSync(os.Stdout), loggerLevelDeal),
 | |
| 	}
 | |
| 	// 最后创建具体的Logger
 | |
| 	core := zapcore.NewTee(fileHandlerList...)
 | |
| 
 | |
| 	// 需要传入 zap.AddCaller() 才会显示打日志点的文件名和行数, 跳过一行可以直接显示业务代码行号,否则显示日志包行号
 | |
| 	logConfList := make([]zap.Option, 0)
 | |
| 	if o.WithCaller {
 | |
| 		logConfList = append(logConfList, zap.AddCaller(), zap.AddCallerSkip(o.WithCallerSkip))
 | |
| 	}
 | |
| 	log := zap.New(core, logConfList...)
 | |
| 	return log, nil
 | |
| }
 | |
| 
 | |
| type Logger struct {
 | |
| 	splitConfig *RotateLogConfig
 | |
| 	encoder     zapcore.Encoder
 | |
| }
 | |
| 
 | |
| // getWriter 获取日志实例
 | |
| func (l *Logger) getWriter() (io.Writer, error) {
 | |
| 	option := make([]rotatelogs.Option, 0)
 | |
| 	option = append(option, rotatelogs.WithRotationTime(l.splitConfig.TimeInterval))
 | |
| 	if l.splitConfig.MaxAge > 0 {
 | |
| 		option = append(option, rotatelogs.WithMaxAge(time.Duration(l.splitConfig.MaxAge)*time.Second))
 | |
| 	}
 | |
| 	var (
 | |
| 		hook *rotatelogs.RotateLogs
 | |
| 		err  error
 | |
| 	)
 | |
| 	if hook, err = rotatelogs.New(l.splitConfig.FullLogFormat, option...); nil != err {
 | |
| 		return nil, CreateIOWriteError(err)
 | |
| 	}
 | |
| 
 | |
| 	return hook, nil
 | |
| }
 | |
| 
 | |
| type wsWriter struct {
 | |
| }
 | |
| 
 | |
| // Write ws的writer
 | |
| func (w *wsWriter) Write(p []byte) (n int, err error) {
 | |
| 	if nil == wsLoggerConnect {
 | |
| 		return 0, nil
 | |
| 	}
 | |
| 	p = []byte("              " + string(p))
 | |
| 	allConnList := wsLoggerConnect.GetCtxList()
 | |
| 	for _, conn := range allConnList {
 | |
| 		_ = conn.Session.Write(p)
 | |
| 	}
 | |
| 	return 0, nil
 | |
| }
 |