This commit is contained in:
Yun
2024-01-22 18:05:51 +08:00
commit fc485d8670
10 changed files with 433 additions and 0 deletions
+124
View File
@@ -0,0 +1,124 @@
package loggerx
// author:黄新云
// lastTime:2023年6月30日21:28:04
// desc: 日志封装类
// 优化方向
// 可以写盘的时候添加缓存,但是有个难点就是如果采用缓存的方式必须保证这个是最后关闭的,如果不是则退出的时候会丢失日志(写在缓存里还没刷盘)
// TODO:自动清除过期日志
import (
"bytes"
"context"
"fmt"
"io"
"log"
"os"
"runtime"
"sync"
// "sync_log/global"
"github.com/gin-gonic/gin"
)
// 需要实现io.Writer接口
type Logger struct {
file *os.File
fileName string
mu sync.Mutex
// channel string
}
func NewLogger(opts ...Option) *Logger {
opt := defaultOptions()
for _, apply := range opts {
apply(&opt)
}
l := &Logger{}
// 打开文件
err := l.createNewFile(true)
if err != nil {
panic(err)
}
log.SetOutput(l)
log.SetFlags(log.LstdFlags | log.Llongfile | log.Lmicroseconds) // log.Lshortfile | log.LUTC
// 保存Gin日志写入到文件+控制台
gin.DefaultWriter = io.MultiWriter(l, os.Stdout)
gin.DefaultErrorWriter = io.MultiWriter(l, os.Stdout)
// 赋值前缀
if prefix != "" {
log.SetPrefix(fmt.Sprintf("[%s]", prefix))
}
return l
}
// func (l *Logger) Channel(ch string) (r *Logger) {
// rr := l
// rr.channel = ch
// return rr
// }
// 超时删除
func (l *Logger) Write(b []byte) (n int, err error) {
if l.file == nil {
// 新建一个file连接
l.createNewFile(false)
}
if l.fileName != nowFileName() {
l.createNewFile(false)
}
n, err = l.file.Write(b)
if err == nil && n < len(b) {
err = io.ErrShortWrite
}
if err != nil {
// 强制更新
l.createNewFile(true)
}
return n, err
}
func (l *Logger) Info(ctx context.Context, v ...any) {
l.logger(ctx, "info", v...)
}
func (l *Logger) Infof(ctx context.Context, format string, v ...any) {
s := fmt.Sprintf(format, v...)
l.logger(ctx, "info", s)
}
func (l *Logger) Error(ctx context.Context, v ...any) {
l.logger(ctx, "error", v...)
}
func (l *Logger) Errorf(ctx context.Context, format string, v ...any) {
s := fmt.Sprintf(format, v...)
l.logger(ctx, "error", s)
}
// 添加固定的内容
// func (l *Logger) ContextWithFields(ctx context.Context, v ...any) {
// l.logger(ctx, "add", v...)
// }
// func (l *Logger) Field(key,val string) {
// l.logger(nil, "add", key,val)
// }
func getGID() string {
b := make([]byte, 64)
b = b[:runtime.Stack(b, false)]
b = bytes.TrimPrefix(b, []byte("goroutine "))
b = b[:bytes.IndexByte(b, ' ')]
return string(b)
}