You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
golog/logrus.go

209 lines
5.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package golog
import (
"context"
"fmt"
"github.com/sirupsen/logrus"
"go.dtapp.net/gotime"
"go.dtapp.net/gotrace_id"
"io"
"log"
"os"
"path"
)
type LogRusLogConfig struct {
LogPath string // 日志文件路径
LogInConsole bool // 是否同时输出到控制台
}
type LogRusLog struct {
config *LogRusLogConfig // 配置
logger *logrus.Logger // 日志服务
entry *logrus.Entry // 日志
level logrus.Level // 日志等级
}
func NewLogRusLog(config *LogRusLogConfig) *LogRusLog {
lr := &LogRusLog{config: config}
lr.logger = logrus.New()
// 设置为json格式
lr.logger.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: gotime.DateTimeFormat,
})
// 需要保存到文件
if lr.config.LogPath != "" {
lr.logger.SetReportCaller(true)
}
return lr
}
// 跟踪编号
func (lr *LogRusLog) withTraceId(ctx context.Context) *LogRusLog {
lr.entry = lr.logger.WithField("trace_id", gotrace_id.GetTraceIdContext(ctx))
return lr
}
// Print 打印
func (lr *LogRusLog) Print(ctx context.Context, args ...interface{}) {
lr.withTraceId(ctx)
lr.entry.Print(args...)
}
// Printf 打印
func (lr *LogRusLog) Printf(ctx context.Context, format string, args ...interface{}) {
lr.withTraceId(ctx)
lr.entry.Printf(format, args...)
}
// Println 打印
func (lr *LogRusLog) Println(ctx context.Context, args ...interface{}) {
lr.withTraceId(ctx)
lr.entry.Println(args...)
}
// Panic 记录日志然后panic
func (lr *LogRusLog) Panic(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Panic(args...)
}
// Panicf 记录日志然后panic
func (lr *LogRusLog) Panicf(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Panicf(format, args...)
}
// Fatal 有致命性错误,导致程序崩溃,记录日志,然后退出
func (lr *LogRusLog) Fatal(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Fatal(args...)
}
// Fatalf 有致命性错误,导致程序崩溃,记录日志,然后退出
func (lr *LogRusLog) Fatalf(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Fatalf(format, args...)
}
// Error 错误日志
func (lr *LogRusLog) Error(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Error(args...)
}
// Errorf 错误日志
func (lr *LogRusLog) Errorf(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Errorf(format, args...)
}
// Warn 警告日志
func (lr *LogRusLog) Warn(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Warn(args...)
}
// Warnf 警告日志
func (lr *LogRusLog) Warnf(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Warnf(format, args...)
}
// Info 核心流程日志
func (lr *LogRusLog) Info(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Info(args...)
}
// Infof 核心流程日志
func (lr *LogRusLog) Infof(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Infof(format, args...)
}
// Debug debug日志调试日志
func (lr *LogRusLog) Debug(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Debug(args...)
}
// Debugf debug日志调试日志
func (lr *LogRusLog) Debugf(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Debugf(format, args...)
}
// Trace 粒度超细的,一般情况下我们使用不上
func (lr *LogRusLog) Trace(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Debug(args...)
}
// Tracef 粒度超细的,一般情况下我们使用不上
func (lr *LogRusLog) Tracef(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Tracef(format, args...)
}
// https://www.fushengwushi.com/archives/1397
// https://blog.csdn.net/oscarun/article/details/114295955
// https://juejin.cn/post/6974353191974469668
func (lr *LogRusLog) setOutPutFile() {
// 是否保存到文件
if lr.config.LogPath == "" {
return
}
// 判断文件夹
if _, err := os.Stat(lr.config.LogPath); os.IsNotExist(err) {
err = os.MkdirAll(lr.config.LogPath, 0777)
if err != nil {
panic(fmt.Errorf("create log dir '%s' error: %s", lr.config.LogPath, err))
}
}
// 日志名
fileName := path.Join(lr.config.LogPath, "logrus."+gotime.Current().SetFormat(gotime.ShortDateFormat)+".log")
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
// 是否同时输出到控制台
if lr.config.LogInConsole {
lr.logger.SetOutput(os.Stdout)
writers := []io.Writer{
file,
os.Stdout,
}
fileAndStdoutWriter := io.MultiWriter(writers...)
if err == nil {
lr.logger.SetOutput(fileAndStdoutWriter)
} else {
log.Printf("无法记录到文件 %s\n", fileName)
}
} else {
lr.logger.SetOutput(file)
}
return
}