- update log
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details

master v1.0.28
李光春 2 years ago
parent 8c6cc53950
commit 5d338d96aa

2
.gitignore vendored

@ -5,5 +5,5 @@
.vscode
*.log
gomod.sh
time_test.go
*_test.go
/vendor/

@ -11,16 +11,15 @@ import (
type ApiClientConfig struct {
GormClient *dorm.GormClient // 数据库驱动
IpService *goip.Client // ip服务
TableName string // 表名
LogClient *GoLog // 日志驱动
LogClient *ZapLog // 日志驱动
LogDebug bool // 日志开关
}
// ApiClient 接口
type ApiClient struct {
gormClient *dorm.GormClient // 数据库驱动
logClient *GoLog // 日志驱动
logClient *ZapLog // 日志驱动
config struct {
tableName string // 表名
insideIp string // 内网ip

@ -1,3 +1,3 @@
package golog
const Version = "1.0.27"
const Version = "1.0.28"

@ -16,7 +16,7 @@ type GinClientConfig struct {
GormClient *dorm.GormClient // 数据库驱动
IpService *goip.Client // ip服务
TableName string // 表名
LogClient *GoLog // 日志驱动
LogClient *ZapLog // 日志驱动
LogDebug bool // 日志开关
}
@ -24,7 +24,7 @@ type GinClientConfig struct {
type GinClient struct {
gormClient *dorm.GormClient // 数据库驱动
ipService *goip.Client // ip服务
logClient *GoLog // 日志驱动
logClient *ZapLog // 日志驱动
config struct {
tableName string // 表名
insideIp string // 内网ip

@ -5,17 +5,18 @@ go 1.19
require (
github.com/gin-gonic/gin v1.8.1
github.com/natefinch/lumberjack v2.0.0+incompatible
go.dtapp.net/dorm v1.0.19
github.com/rs/zerolog v1.27.0
github.com/sirupsen/logrus v1.9.0
go.dtapp.net/dorm v1.0.26
go.dtapp.net/goip v1.0.25
go.dtapp.net/gojson v1.0.1
go.dtapp.net/gorequest v1.0.26
go.dtapp.net/gorequest v1.0.27
go.dtapp.net/gotime v1.0.5
go.dtapp.net/gotrace_id v1.0.2
go.dtapp.net/gotrace_id v1.0.5
go.dtapp.net/gourl v1.0.0
go.dtapp.net/goxml v1.0.1
go.uber.org/zap v1.22.0
gorm.io/datatypes v1.0.7
gorm.io/driver/postgres v1.3.8
gorm.io/gorm v1.23.8
)
@ -46,6 +47,7 @@ require (
github.com/klauspost/compress v1.15.9 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/lib/pq v1.10.6 // indirect
github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
@ -54,7 +56,6 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/saracen/go7z v0.0.0-20191010121135-9c09b6bd7fda // indirect
github.com/saracen/solidblock v0.0.0-20190426153529-45df20abab6f // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
github.com/syndtr/goleveldb v1.0.0 // indirect
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect
github.com/ugorji/go/codec v1.2.7 // indirect
@ -85,6 +86,7 @@ require (
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gorm.io/driver/mysql v1.3.5 // indirect
gorm.io/driver/postgres v1.3.8 // indirect
gorm.io/driver/sqlite v1.3.6 // indirect
gorm.io/driver/sqlserver v1.3.2 // indirect
mellium.im/sasl v0.2.1 // indirect

@ -52,6 +52,7 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
@ -111,6 +112,7 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
github.com/goccy/go-json v0.8.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.9.10 h1:hCeNmprSNLB8B8vQKWl6DpuH0t60oEs+TAk9a7CScKc=
github.com/goccy/go-json v0.9.10/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
@ -309,6 +311,8 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
@ -414,8 +418,11 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs=
github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
@ -501,22 +508,22 @@ github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
go.dtapp.net/dorm v1.0.19 h1:3uH4tYZ5zH4knx9o6BJlE3rFiWNWTyMxlpt0Cwoq7zE=
go.dtapp.net/dorm v1.0.19/go.mod h1:bHG7BmgeLaAlc56myYF63lwZAIuMeWRAqHBb/L84dLM=
go.dtapp.net/dorm v1.0.26 h1:UkNuEVwlwB/chWr4LV1qKdt2tpcoDvPmR3KbGGeMWts=
go.dtapp.net/dorm v1.0.26/go.mod h1:bHG7BmgeLaAlc56myYF63lwZAIuMeWRAqHBb/L84dLM=
go.dtapp.net/goip v1.0.25 h1:GSgQkR7dc28TX8E1mF3wAy+EEGZ++tgqc8Q85OKZPEY=
go.dtapp.net/goip v1.0.25/go.mod h1:dKeNuWJttH4AvvYVHV0FagB6BVvFM1HGDKFxLKr+hkQ=
go.dtapp.net/gojson v1.0.1 h1:MHeSGlq1KxzL7rCkm18fhwW4GNORHohdDMmxY5PupKY=
go.dtapp.net/gojson v1.0.1/go.mod h1:TkkpTNxHBKxul0e7gC5MrL1K4ICFB9mQ7wHzjBah3/k=
go.dtapp.net/gorandom v1.0.1 h1:IWfMClh1ECPvyUjlqD7MwLq4mZdUusD1qAwAdsvEJBs=
go.dtapp.net/gorandom v1.0.1/go.mod h1:ZPdgalKpvFV/ATQqR0k4ns/F/IpITAZpx6WkWirr5Y8=
go.dtapp.net/gorequest v1.0.26 h1:t+rMW7liLHz1RgY60ztWIghSkTeQePKWM0EsDG1IqMI=
go.dtapp.net/gorequest v1.0.26/go.mod h1:sDhiEPwdZnUbyDuq/3OAzA1qvpU5yo49v1fY5sVgj18=
go.dtapp.net/gorequest v1.0.27 h1:Hip1mfSZJDNcmE2iZgB3PYa0C/7BAMEJLsCaMd6t9iE=
go.dtapp.net/gorequest v1.0.27/go.mod h1:922s7pjYulKIytUMGAYS4aHU6cnzTbOQURGBPCKSxAk=
go.dtapp.net/gostring v1.0.6 h1:XqNaThEfHpweLofru5sBqm1UUzc9JWsXyB/M/rTk29w=
go.dtapp.net/gostring v1.0.6/go.mod h1:AMnnLjyNxH+cphxyASJGYCzWpVrkP5RncuVo8xL8s3E=
go.dtapp.net/gotime v1.0.5 h1:12aNgB2ULpP6QgQHEUkLilZ4ASvhpFxMFQkBwn0par8=
go.dtapp.net/gotime v1.0.5/go.mod h1:Gq7eNLr2iMLP18UNWONRq4V3Uhf/ADp4bIrS+Tc6ktY=
go.dtapp.net/gotrace_id v1.0.2 h1:wSc7dYzkAwSz3MbPu2Io4XqHe0l0dIaJe3vlpDAZrXY=
go.dtapp.net/gotrace_id v1.0.2/go.mod h1:476T5KMJw9c6DM/rJn7y6d28hcNDv4+wew4sd+powes=
go.dtapp.net/gotrace_id v1.0.5 h1:znUwvMcX7ADQn8f750yIb5xJa9tJ4P0fHb5tSo7EFeg=
go.dtapp.net/gotrace_id v1.0.5/go.mod h1:476T5KMJw9c6DM/rJn7y6d28hcNDv4+wew4sd+powes=
go.dtapp.net/gourl v1.0.0 h1:Zbe0GiMFyyRy2+bjbVsYulakH5d58w3CDZkUPonlMoQ=
go.dtapp.net/gourl v1.0.0/go.mod h1:x9A/pJ3iKDTb6Gu2RtJy2iHg56IowXIcIGQdogqpGjs=
go.dtapp.net/goxml v1.0.1 h1:WODsjNpmHTtoeLsXgOjC81qRbu4aXZ3LKBHApNGaPjY=
@ -648,6 +655,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

@ -1,31 +0,0 @@
package golog
import (
"log"
"testing"
)
func TestLog(t *testing.T) {
g := NewGoLog(&ConfigGoLog{
LogPath: "./",
LogName: "all.log",
LogLevel: "debug",
MaxSize: 2,
MaxBackups: 30,
MaxAge: 0,
Compress: false,
JsonFormat: false,
ShowLine: true,
LogInConsole: true,
})
log.Println(g.Logger)
g.Logger.Debug("debug 日志")
g.Logger.Sugar().Debug("debug 日志")
g.Logger.Info("info 日志")
g.Logger.Sugar().Info("info 日志")
g.Logger.Warn("warning 日志")
g.Logger.Sugar().Warn("warning 日志")
g.Logger.Error("error 日志")
g.Logger.Sugar().Error("error 日志")
log.Println(g.Logger)
}

@ -0,0 +1,55 @@
package golog
import (
"context"
"github.com/sirupsen/logrus"
"go.dtapp.net/gotime"
"go.dtapp.net/gotrace_id"
)
type LogRusConsole struct {
logger *logrus.Logger // 日志服务
entry *logrus.Entry // 日志
}
// NewLogRusConsole 初始化控制台
func NewLogRusConsole() *LogRusConsole {
lrc := &LogRusConsole{}
lrc.logger = logrus.New()
lrc.logger.SetFormatter(&logrus.TextFormatter{
ForceColors: true,
TimestampFormat: gotime.DateTimeFormat,
})
return lrc
}
// 跟踪编号
func (lrc *LogRusConsole) withTraceId(ctx context.Context) {
traceId := gotrace_id.GetTraceIdContext(ctx)
if traceId == "" {
lrc.entry = lrc.logger.WithFields(logrus.Fields{})
} else {
lrc.entry = lrc.logger.WithField("trace_id", gotrace_id.GetTraceIdContext(ctx))
}
}
// Print 打印
func (lrc *LogRusConsole) Print(ctx context.Context, args ...interface{}) {
lrc.withTraceId(ctx)
lrc.entry.Print(args...)
}
// Printf 打印
func (lrc *LogRusConsole) Printf(ctx context.Context, format string, args ...interface{}) {
lrc.withTraceId(ctx)
lrc.entry.Printf(format, args...)
}
// Println 打印
func (lrc *LogRusConsole) Println(ctx context.Context, args ...interface{}) {
lrc.withTraceId(ctx)
lrc.entry.Println(args...)
}

@ -0,0 +1,208 @@
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
}

@ -1,15 +0,0 @@
package golog
import (
"runtime"
"strings"
"testing"
)
func TestSystem(t *testing.T) {
var s System
s.Init()
t.Logf("%+v", s)
t.Logf("%+v", runtime.Version())
t.Logf("%+v", strings.TrimPrefix(runtime.Version(), "go"))
}

@ -1,7 +0,0 @@
package golog
import "testing"
func TestVersion(t *testing.T) {
t.Log(Version)
}

@ -0,0 +1,46 @@
package golog
import (
"context"
"go.dtapp.net/gotrace_id"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
)
type ZapConsole struct {
logger *zap.Logger // 日志服务
}
func NewZapConsole() *ZapConsole {
zc := &ZapConsole{}
zc.logger = zap.New(zapcore.NewCore(
zapcore.NewConsoleEncoder(zapcore.EncoderConfig{}),
zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout)),
zap.InfoLevel,
))
return zc
}
// 跟踪编号
func (zc *ZapConsole) getTraceId(ctx context.Context) zap.Field {
traceId := gotrace_id.GetTraceIdContext(ctx)
if traceId == "" {
return zap.Field{}
} else {
return zap.String("trace_id", traceId)
}
}
// Print 打印
func (zc *ZapConsole) Print(ctx context.Context, args ...interface{}) {
zc.logger.Sugar().Info(args, zc.getTraceId(ctx))
}
// Printf 打印
func (zc *ZapConsole) Printf(ctx context.Context, template string, args ...interface{}) {
zc.logger.Sugar().Infof(template, args, zc.getTraceId(ctx))
}

@ -8,7 +8,7 @@ import (
"time"
)
type ConfigGoLog struct {
type ZapLogConfig struct {
LogPath string // 日志文件路径
LogName string // 日志文件名
LogLevel string // 日志级别 debug/info/warn/errordebug输出debug/info/warn/error日志。 info输出info/warn/error日志。 warn输出warn/error日志。 error输出error日志。
@ -21,27 +21,18 @@ type ConfigGoLog struct {
LogInConsole bool // 是否同时输出到控制台
}
type GoLog struct {
ConfigGoLog
type ZapLog struct {
config *ZapLogConfig
Logger *zap.Logger
}
func NewGoLog(config *ConfigGoLog) *GoLog {
g := &GoLog{}
g.LogPath = config.LogPath
g.LogName = config.LogName
g.LogLevel = config.LogLevel
g.MaxSize = config.MaxSize
g.MaxBackups = config.MaxBackups
g.MaxAge = config.MaxAge
g.Compress = config.Compress
g.JsonFormat = config.JsonFormat
g.ShowLine = config.ShowLine
g.LogInConsole = config.LogInConsole
func NewZapLog(config *ZapLogConfig) *ZapLog {
zl := &ZapLog{config: config}
// 设置日志级别
var level zapcore.Level
switch g.LogLevel {
switch zl.config.LogLevel {
case "debug":
level = zap.DebugLevel
case "info":
@ -70,17 +61,17 @@ func NewGoLog(config *ConfigGoLog) *GoLog {
// 定义日志切割配置
hook := lumberjack.Logger{
Filename: g.LogPath + g.LogName, // 日志文件的位置
MaxSize: g.MaxSize, // 在进行切割之前日志文件的最大大小以MB为单位
MaxBackups: g.MaxBackups, // 保留旧文件的最大个数
Compress: g.Compress, // 是否压缩 disabled by default
Filename: zl.config.LogPath + zl.config.LogName, // 日志文件的位置
MaxSize: zl.config.MaxSize, // 在进行切割之前日志文件的最大大小以MB为单位
MaxBackups: zl.config.MaxBackups, // 保留旧文件的最大个数
Compress: zl.config.Compress, // 是否压缩 disabled by default
}
if g.MaxAge > 0 {
hook.MaxAge = g.MaxAge // days
if zl.config.MaxAge > 0 {
hook.MaxAge = zl.config.MaxAge // days
}
// 判断是否控制台输出日志
if g.LogInConsole {
if zl.config.LogInConsole {
syncer = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook))
} else {
syncer = zapcore.AddSync(&hook)
@ -103,8 +94,9 @@ func NewGoLog(config *ConfigGoLog) *GoLog {
}
var encoder zapcore.Encoder
// 判断是否json格式输出
if g.JsonFormat {
if zl.config.JsonFormat {
encoder = zapcore.NewJSONEncoder(encoderConfig)
} else {
encoder = zapcore.NewConsoleEncoder(encoderConfig)
@ -116,12 +108,12 @@ func NewGoLog(config *ConfigGoLog) *GoLog {
level,
)
g.Logger = zap.New(core)
zl.Logger = zap.New(core)
// 判断是否显示代码行号
if g.ShowLine {
g.Logger = g.Logger.WithOptions(zap.AddCaller())
if zl.config.ShowLine {
zl.Logger = zl.Logger.WithOptions(zap.AddCaller())
}
return g
return zl
}

@ -0,0 +1,46 @@
package golog
import (
"context"
"github.com/rs/zerolog"
"go.dtapp.net/gotime"
"go.dtapp.net/gotrace_id"
)
type ZeroLogConsole struct {
logger zerolog.Logger // 日志服务
w zerolog.ConsoleWriter // 日志
}
// NewZeroLogConsole 初始化控制台
func NewZeroLogConsole() *ZeroLogConsole {
zlc := &ZeroLogConsole{}
zlc.w = zerolog.NewConsoleWriter()
zlc.w.TimeFormat = gotime.DateTimeFormat
return zlc
}
// 跟踪编号
func (zlc *ZeroLogConsole) withTraceId(ctx context.Context) {
traceId := gotrace_id.GetTraceIdContext(ctx)
if traceId == "" {
zlc.logger = zerolog.New(zlc.w).With().Timestamp().Logger()
} else {
zlc.logger = zerolog.New(zlc.w).With().Str("trace_id", gotrace_id.GetTraceIdContext(ctx)).Timestamp().Logger()
}
}
// Print 打印
func (zlc *ZeroLogConsole) Print(ctx context.Context, v ...interface{}) {
zlc.withTraceId(ctx)
zlc.logger.Print(v...)
}
// Printf 打印
func (zlc *ZeroLogConsole) Printf(ctx context.Context, format string, v ...interface{}) {
zlc.withTraceId(ctx)
zlc.logger.Printf(format, v...)
}

@ -0,0 +1,88 @@
package golog
import (
"github.com/natefinch/lumberjack"
"github.com/rs/zerolog"
"io"
"time"
)
type ZeroLogLog struct {
}
type (
Logger = *zerolog.Logger
Level = zerolog.Level
)
var (
DebugLevel = zerolog.DebugLevel
InfoLevel = zerolog.InfoLevel
WarnLevel = zerolog.WarnLevel
ErrorLevel = zerolog.ErrorLevel
)
// Config 可用在配置文件中
type Config struct {
Filename string // 日志文件
MaxSize int // megabytes
MaxBackups int // MaxBackups
MaxAge int // days
Fields map[string]string // slog的初始化字段(session)
IsJSON bool // 默认是非json格式
}
// New 日常使用的log, 建议使用json效率更高
func New(c Config) Logger {
// init zerolog format
zerolog.TimeFieldFormat = "2006-01-02T15:04:05.000"
zerolog.DurationFieldInteger = true
zerolog.TimestampFieldName = "timestamp"
zerolog.DurationFieldUnit = time.Millisecond
out := &lumberjack.Logger{
Filename: c.Filename,
MaxSize: c.MaxSize, // megabytes
MaxBackups: c.MaxBackups, // MaxBackups
MaxAge: c.MaxAge, // days
LocalTime: true, // 这个需要设置, 不然日志文件的名字就是UTC时间
}
var zout io.Writer
if c.IsJSON {
zout = out
} else {
w := zerolog.NewConsoleWriter()
w.TimeFormat = "2006-01-02T15:04:05.000"
w.NoColor = true
w.FormatLevel = formatLevel
w.Out = out
zout = w
}
zc := zerolog.New(zout).With().Timestamp()
for k, v := range c.Fields {
zc = zc.Str(k, v)
}
slog := zc.Logger()
return &slog
}
// NewConsole 创建终端日志格式
func NewConsole() Logger {
w := zerolog.NewConsoleWriter()
w.TimeFormat = "01-02T15:04:05"
w.NoColor = true
w.FormatLevel = formatLevel
log := zerolog.New(w).With().Timestamp().Logger()
return &log
}
// formatLevel 不用默认的, 用比较直观的
// 参考: https://github.com/rs/zerolog/blob/master/console.go#L315
func formatLevel(i interface{}) string {
if ll, ok := i.(string); ok {
return ll
}
return "" // 异常时候, level为空
}
Loading…
Cancel
Save