From fc485d86708ad1ee7f0d84bb2325ede3e40652a4 Mon Sep 17 00:00:00 2001 From: Yun Date: Mon, 22 Jan 2024 18:05:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + delete.go | 5 ++ filePath.go | 58 ++++++++++++++++++++++ format.go | 32 +++++++++++++ go.mod | 32 +++++++++++++ go.sum | 85 +++++++++++++++++++++++++++++++++ loggerx.go | 124 ++++++++++++++++++++++++++++++++++++++++++++++++ loggerx_test.go | 19 ++++++++ options.go | 54 +++++++++++++++++++++ readme.md | 23 +++++++++ 10 files changed, 433 insertions(+) create mode 100644 .gitignore create mode 100644 delete.go create mode 100644 filePath.go create mode 100644 format.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 loggerx.go create mode 100644 loggerx_test.go create mode 100644 options.go create mode 100644 readme.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fbf828d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +log \ No newline at end of file diff --git a/delete.go b/delete.go new file mode 100644 index 0000000..cb2625c --- /dev/null +++ b/delete.go @@ -0,0 +1,5 @@ +package loggerx + + + + diff --git a/filePath.go b/filePath.go new file mode 100644 index 0000000..2296fe9 --- /dev/null +++ b/filePath.go @@ -0,0 +1,58 @@ +package loggerx + +import ( + "fmt" + "os" + "path/filepath" + "time" +) + +// 日志文件的计算 + +// 获取最新的文件名 +func nowFileName() string { + // ioc, _ := time.LoadLocation("Asia/Shanghai") + // timeDir := fmt.Sprint(time.Now().In(ioc).Format("2006/01/02/15")) // 2006-01-02 15:04:05 + timeDir := fmt.Sprint(time.Now().Local().Format("2006/01/02")) // 2006-01-02 15:04:05 + path := "./log/" + timeDir + ".log" + // fmt.Println(filepath.Abs(path)) + return path +} + +// 新建文件 +func (l *Logger) createNewFile(isMust bool) error { + l.mu.Lock() + defer l.mu.Unlock() + + fileName := nowFileName() + + if !isMust { + if l.file != nil && l.fileName == fileName { + return nil + } + } + + dir, _ := filepath.Split(fileName) // 识别目录与文件 + os.MkdirAll(dir, os.ModePerm) // 创建多层目录,如果存在不会报错 + + // 打开该文件,如果不存在则创建 + file, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) + if err != nil { + // 打开失败,尝试创建 + fmt.Println("打开日志文件失败") + return err + } + // 关闭原来的文件 + if l.file != nil { + l.closeFile() + } + l.file = file + l.fileName = fileName + return nil +} + +// 关闭文件 +func (l *Logger) closeFile() error { + l.file.Sync() + return l.file.Close() +} diff --git a/format.go b/format.go new file mode 100644 index 0000000..742410c --- /dev/null +++ b/format.go @@ -0,0 +1,32 @@ +package loggerx + +import ( + "context" + "encoding/json" + "fmt" + "path/filepath" + "runtime" + "strings" + "time" +) + +func (l *Logger) logger(ctx context.Context, action string, v ...any) { + pc, file, line, _ := runtime.Caller(2) + // fmt.Println("runtime.Caller", pc, file, line, ok) + + funcName := runtime.FuncForPC(pc).Name() + funcName = filepath.Ext(funcName) + funcName = strings.TrimPrefix(funcName, ".") + + by, _ := json.Marshal(v) + + nowTime := time.Now().Local().Format("20060102 15:04:05.000000") + + traceId, _ := ctx.Value("trace_id").(string) + + writeStr := "[" + action + "]" + nowTime + " " + file + ":" + fmt.Sprintf("%d", line) + " " + funcName + " gid:" + getGID() + " " + traceId + " @data@: " + string(by) + "\n\n" + + l.Write([]byte(writeStr)) + + // log.Println("" + string(by)) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..2500314 --- /dev/null +++ b/go.mod @@ -0,0 +1,32 @@ +module code.yun.ink/pkg/loggerx + +go 1.19 + +require github.com/gin-gonic/gin v1.9.1 + +require ( + github.com/bytedance/sonic v1.9.1 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.14.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/arch v0.3.0 // indirect + golang.org/x/crypto v0.9.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..0e0c33a --- /dev/null +++ b/go.sum @@ -0,0 +1,85 @@ +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/loggerx.go b/loggerx.go new file mode 100644 index 0000000..37f9533 --- /dev/null +++ b/loggerx.go @@ -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) +} diff --git a/loggerx_test.go b/loggerx_test.go new file mode 100644 index 0000000..c55a9ba --- /dev/null +++ b/loggerx_test.go @@ -0,0 +1,19 @@ +package loggerx_test + +import ( + "context" + "testing" + + "code.yun.ink/pkg/loggerx" +) + +// func TestMain(m *testing.M) { +// } + +func TestLogger(t *testing.T) { + + l := loggerx.InitLogger("profix") + + l.Error(context.Background(), "test error") + +} diff --git a/options.go b/options.go new file mode 100644 index 0000000..f047f58 --- /dev/null +++ b/options.go @@ -0,0 +1,54 @@ +package loggerx + +type loggerOption struct { + prefix string + format string + isGinLog bool + isGid bool +} + +func defaultOptions() loggerOption { + return loggerOption{ + format: "json", + } +} + +type Option func(*loggerOption) + +// 日志的前缀 +func SetPrefix(prefix string) Option { + return func(o *loggerOption) { + o.prefix = prefix + } +} + +// 日志格式(默认json) +func SetFormat(format string) Option { + return func(o *loggerOption) { + o.format = format + } +} + +// 是否保存gin的日志 +func SetGinLog() Option { + return func(o *loggerOption) { + o.isGinLog = true + } +} + +// 文件规则 +func SetFilePath(path string) Option { + return func(o *loggerOption) { + // o.isGinLog = true + } +} + +// 保存goroutine的ID信息 +func SetGID() Option { + return func(o *loggerOption) { + o.isGid = true + } +} + +// 文件切割规则 +// func SetFileSplit() diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..d2fca92 --- /dev/null +++ b/readme.md @@ -0,0 +1,23 @@ + +# 简介 + +这个是基于原生log实现的日志存储。 + +```go + +log.Println("ddddd") + +``` + + +# 开发计划 + +1. 自动清除过期的日志文件 +2. 支持日志文件压缩 +3. 支持日志文件切割 +4. 支持日志文件归档 +5. 支持多种文件分割类型 + 1. 按照时间分割 + 2. 按照文件大小分割 + 3. 按照日志行数分割 +