diff --git a/apis/system/sysuser.go b/apis/system/sysuser.go index 79516fc..eec4f7b 100644 --- a/apis/system/sysuser.go +++ b/apis/system/sysuser.go @@ -2,13 +2,13 @@ package system import ( "ferry/models/system" + "ferry/pkg/logger" "ferry/tools" "ferry/tools/app" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/google/uuid" - log "github.com/sirupsen/logrus" ) /* @@ -265,7 +265,7 @@ func InsetSysUserAvatar(c *gin.Context) { guid := uuid.New().String() filPath := "static/uploadfile/" + guid + ".jpg" for _, file := range files { - log.Println(file.Filename) + logger.Info(file.Filename) // 上传文件至指定目录 err = c.SaveUploadedFile(file, filPath) if err != nil { diff --git a/cmd/api/server.go b/cmd/api/server.go index 1543394..0eafabb 100644 --- a/cmd/api/server.go +++ b/cmd/api/server.go @@ -4,18 +4,19 @@ import ( "context" "ferry/database" "ferry/global/orm" + "ferry/pkg/logger" "ferry/router" "ferry/tools" config2 "ferry/tools/config" "fmt" "io/ioutil" + "log" "net/http" "os" "os/signal" "time" "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" ) @@ -53,9 +54,7 @@ func setup() { //1. 读取配置 config2.ConfigSetup(config) - //2. 设置日志 - tools.InitLogger() - //3. 初始化数据库链接 + //2. 初始化数据库链接 database.Setup() } @@ -73,7 +72,7 @@ func run() error { defer func() { err := orm.Eloquent.Close() if err != nil { - log.Error(err) + logger.Error(err) } }() @@ -90,11 +89,11 @@ func run() error { // 服务连接 if config2.ApplicationConfig.IsHttps { if err := srv.ListenAndServeTLS(config2.SslConfig.Pem, config2.SslConfig.KeyStr); err != nil && err != http.ErrServerClosed { - log.Fatalf("listen: %s\n", err) + logger.Fatalf("listen: %s\n", err) } } else { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { - log.Fatalf("listen: %s\n", err) + logger.Fatalf("listen: %s\n", err) } } }() @@ -112,8 +111,8 @@ func run() error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { - log.Fatal("Server Shutdown:", err) + logger.Fatal("Server Shutdown:", err) } - log.Println("Server exiting") + logger.Info("Server exiting") return nil } diff --git a/cmd/cobra.go b/cmd/cobra.go index 366c850..8ec1a68 100644 --- a/cmd/cobra.go +++ b/cmd/cobra.go @@ -4,9 +4,9 @@ import ( "errors" "ferry/cmd/api" "ferry/cmd/migrate" + "ferry/pkg/logger" "os" - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) @@ -25,7 +25,7 @@ var rootCmd = &cobra.Command{ PersistentPreRunE: func(*cobra.Command, []string) error { return nil }, Run: func(cmd *cobra.Command, args []string) { usageStr := `欢迎使用 ferry,可以是用 -h 查看命令` - log.Printf("%s\n", usageStr) + logger.Infof("%s\n", usageStr) }, } diff --git a/cmd/migrate/server.go b/cmd/migrate/server.go index 6a09f4a..bdb8196 100644 --- a/cmd/migrate/server.go +++ b/cmd/migrate/server.go @@ -5,12 +5,10 @@ import ( "ferry/global/orm" "ferry/models/gorm" "ferry/models/system" - "ferry/tools" + "ferry/pkg/logger" config2 "ferry/tools/config" "fmt" - log "github.com/sirupsen/logrus" - "github.com/spf13/cobra" ) @@ -36,16 +34,14 @@ func run() { fmt.Println(usage) //1. 读取配置 config2.ConfigSetup(config) - //2. 设置日志 - tools.InitLogger() - //3. 初始化数据库链接 + //2. 初始化数据库链接 database.Setup() - //4. 数据库迁移 + //3. 数据库迁移 _ = migrateModel() - log.Println("数据库结构初始化成功!") - //5. 数据初始化完成 + logger.Info("数据库结构初始化成功!") + //4. 数据初始化完成 if err := system.InitDb(); err != nil { - log.Fatalf("数据库基础数据初始化失败,%v", err) + logger.Fatalf("数据库基础数据初始化失败,%v", err) } usage = `数据库基础数据初始化成功` diff --git a/config/settings.dev.yml b/config/settings.dev.yml index d06de20..9e2863a 100644 --- a/config/settings.dev.yml +++ b/config/settings.dev.yml @@ -31,9 +31,19 @@ settings: jwt: secret: ferry timeout: 3600 + ldap: + host: 127.0.0.1 + port: 389 log: - dir: logs - operdb: false + compress: 1 + consolestdout: 1 + filestdout: 0 + level: debug + localtime: 1 + maxage: 30 + maxbackups: 300 + maxsize: 10240 + path: ./logs/ferry.log redis: host: 127.0.0.1 port: 6379 diff --git a/config/settings.yml b/config/settings.yml index 07ab55a..87733c6 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -13,9 +13,6 @@ settings: ssl: key: keystring pem: temp/pem.pem - log: - operdb: false - dir: logs jwt: secret: ferry timeout: 3600 @@ -40,3 +37,16 @@ settings: maxidleconn: 0 maxopenconn: 20000 domain: http://192.168.0.100:9527 + ldap: + host: 127.0.0.1 + port: 389 + log: + compress: 1 + consolestdout: 1 + filestdout: 1 + level: info + localtime: 1 + maxAge: 30 + maxbackups: 300 + maxsize: 10240 + path: ./logs/ferry.log diff --git a/database/mysql.go b/database/mysql.go index 87b7525..f15d6e6 100644 --- a/database/mysql.go +++ b/database/mysql.go @@ -3,6 +3,7 @@ package database import ( "bytes" "ferry/global/orm" + "ferry/pkg/logger" "ferry/tools/config" "strconv" @@ -10,7 +11,6 @@ import ( _ "github.com/go-sql-driver/mysql" //加载mysql "github.com/jinzhu/gorm" - log "github.com/sirupsen/logrus" ) var ( @@ -32,13 +32,13 @@ func (e *Mysql) Setup() { orm.Eloquent, err = db.Open(DbType, orm.MysqlConn) if err != nil { - log.Fatalf("%s connect error %v", DbType, err) + logger.Fatalf("%s connect error %v", DbType, err) } else { - log.Printf("%s connect success!", DbType) + logger.Infof("%s connect success!", DbType) } if orm.Eloquent.Error != nil { - log.Fatalf("database error %v", orm.Eloquent.Error) + logger.Fatalf("database error %v", orm.Eloquent.Error) } // 是否开启详细日志记录 diff --git a/global/logger.go b/global/logger.go deleted file mode 100644 index f5ec10c..0000000 --- a/global/logger.go +++ /dev/null @@ -1,14 +0,0 @@ -package global - -import ( - "github.com/sirupsen/logrus" -) - -var RequestLogger = &logrus.Entry{} - - - -func init() { - // TODO: requestLogger log format - // RequestLogger = logrus.WithFields(logrus.Fields{"request_id": request_id, "user_ip": user_ip}) -} \ No newline at end of file diff --git a/go.mod b/go.mod index 4d12323..c0d340b 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/gin-contrib/cors v1.3.1 // indirect github.com/gin-gonic/gin v1.5.0 github.com/go-kit/kit v0.8.0 + github.com/go-ldap/ldap/v3 v3.2.3 // indirect github.com/go-ole/go-ole v1.2.4 // indirect github.com/go-openapi/spec v0.19.7 // indirect github.com/go-openapi/swag v0.19.8 // indirect @@ -34,8 +35,10 @@ require ( github.com/swaggo/swag v1.6.5 github.com/ugorji/go v1.1.7 // indirect github.com/unrolled/secure v1.0.8 + go.uber.org/zap v1.10.0 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df + gopkg.in/natefinch/lumberjack.v2 v2.0.0 ) diff --git a/go.sum b/go.sum index 90f72ed..20648e7 100644 --- a/go.sum +++ b/go.sum @@ -41,6 +41,8 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28= +github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -188,12 +190,17 @@ github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmC github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= +github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-ldap/ldap v3.0.3+incompatible h1:HTeSZO8hWMS1Rgb2Ziku6b8a7qRIZZMHjsvuZyatzwk= +github.com/go-ldap/ldap/v3 v3.2.3 h1:FBt+5w3q/vPVPb4eYMQSn+pOiz4zewPamYhlGMmc7yM= +github.com/go-ldap/ldap/v3 v3.2.3/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -736,8 +743,11 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= @@ -760,6 +770,7 @@ golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1082,6 +1093,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= +gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM= +gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1102,6 +1115,10 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ldap.v2 v2.5.1 h1:wiu0okdNfjlBzg6UWvd1Hn8Y+Ux17/u/4nlk4CQr6tU= +gopkg.in/ldap.v2 v2.5.1/go.mod h1:oI0cpe/D7HRtBQl8aTg+ZmzFUAvu4lsv3eLXMLGFxWk= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/redis.v5 v5.2.9/go.mod h1:6gtv0/+A4iM08kdRfocWYB3bLX2tebpNtfKlFT6H4mY= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/handler/auth.go b/handler/auth.go index 2dea237..f64a906 100644 --- a/handler/auth.go +++ b/handler/auth.go @@ -3,13 +3,13 @@ package handler import ( "ferry/models/system" jwt "ferry/pkg/jwtauth" + "ferry/pkg/logger" "ferry/tools" "net/http" "github.com/gin-gonic/gin" "github.com/mojocn/base64Captcha" "github.com/mssola/user_agent" - log "github.com/sirupsen/logrus" ) var store = base64Captcha.DefaultMemStore @@ -71,26 +71,26 @@ func Authenticator(c *gin.Context) (interface{}, error) { loginlog.Status = "1" loginlog.Msg = "数据解析失败" loginlog.Username = loginVals.Username - loginlog.Create() + _, _ = loginlog.Create() return nil, jwt.ErrMissingLoginValues } loginlog.Username = loginVals.Username if !store.Verify(loginVals.UUID, loginVals.Code, true) { loginlog.Status = "1" loginlog.Msg = "验证码错误" - loginlog.Create() + _, _ = loginlog.Create() return nil, jwt.ErrInvalidVerificationode } user, role, e := loginVals.GetUser() if e == nil { - loginlog.Create() + _, _ = loginlog.Create() return map[string]interface{}{"user": user, "role": role}, nil } else { loginlog.Status = "1" loginlog.Msg = "登录失败" - loginlog.Create() - log.Println(e.Error()) + _, _ = loginlog.Create() + logger.Info(e.Error()) } return nil, jwt.ErrFailedAuthentication diff --git a/handler/nofound.go b/handler/nofound.go index 72731e6..2f232ec 100644 --- a/handler/nofound.go +++ b/handler/nofound.go @@ -2,15 +2,15 @@ package handler import ( jwt "ferry/pkg/jwtauth" + "ferry/pkg/logger" "net/http" "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" ) func NoFound(c *gin.Context) { claims := jwt.ExtractClaims(c) - log.Printf("NoRoute claims: %#v\n", claims) + logger.Infof("NoRoute claims: %#v\n", claims) c.JSON(http.StatusOK, gin.H{ "code": "404", "message": "not found", diff --git a/middleware/logger.go b/middleware/logger.go index 0852b46..f380ed2 100644 --- a/middleware/logger.go +++ b/middleware/logger.go @@ -1,10 +1,10 @@ package middleware import ( + "ferry/pkg/logger" "time" "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" ) // 日志记录到文件 @@ -36,7 +36,7 @@ func LoggerToFile() gin.HandlerFunc { clientIP := c.ClientIP() // 日志格式 - log.Infof(" %s %3d %13v %15s %s %s \r\n", + logger.Infof(" %s %3d %13v %15s %s %s", startTime.Format("2006-01-02 15:04:05.9999"), statusCode, latencyTime, diff --git a/middleware/permission.go b/middleware/permission.go index 82b5790..8767ff3 100644 --- a/middleware/permission.go +++ b/middleware/permission.go @@ -4,11 +4,11 @@ import ( mycasbin "ferry/pkg/casbin" "ferry/pkg/jwtauth" _ "ferry/pkg/jwtauth" + "ferry/pkg/logger" "ferry/tools" "net/http" "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" ) //权限检查中间件 @@ -20,7 +20,7 @@ func AuthCheckRole() gin.HandlerFunc { tools.HasError(err, "", 500) //检查权限 res, err := e.Enforce(v["rolekey"], c.Request.URL.Path, c.Request.Method) - log.Println(v["rolekey"], c.Request.URL.Path, c.Request.Method) + logger.Info(v["rolekey"], c.Request.URL.Path, c.Request.Method) tools.HasError(err, "", 500) diff --git a/models/system/sysuser.go b/models/system/sysuser.go index 1753784..1378366 100644 --- a/models/system/sysuser.go +++ b/models/system/sysuser.go @@ -3,10 +3,10 @@ package system import ( "errors" "ferry/global/orm" + "ferry/pkg/logger" "ferry/tools" "strings" - log "github.com/sirupsen/logrus" "golang.org/x/crypto/bcrypt" ) @@ -303,7 +303,7 @@ func (e *SysUser) SetPwd(pwd SysUserPwd) (Result bool, err error) { if strings.Contains(err.Error(), "hashedPassword is not the hash of the given password") { tools.HasError(err, "密码错误(代码202)", 500) } - log.Print(err) + logger.Info(err) return } e.Password = pwd.NewPassword diff --git a/pkg/casbin/mycasbin.go b/pkg/casbin/mycasbin.go index 0e1ffed..0ea0298 100644 --- a/pkg/casbin/mycasbin.go +++ b/pkg/casbin/mycasbin.go @@ -2,16 +2,16 @@ package mycasbin import ( "ferry/global/orm" + "ferry/pkg/logger" "ferry/tools/config" "github.com/casbin/casbin/v2" gormadapter "github.com/casbin/gorm-adapter/v2" "github.com/go-kit/kit/endpoint" _ "github.com/go-sql-driver/mysql" - log "github.com/sirupsen/logrus" ) -var Em endpoint.Middleware +var _ endpoint.Middleware func Casbin() (*casbin.Enforcer, error) { conn := orm.MysqlConn @@ -26,7 +26,7 @@ func Casbin() (*casbin.Enforcer, error) { if err := e.LoadPolicy(); err == nil { return e, err } else { - log.Printf("casbin rbac_model or policy init error, message: %v \r\n", err.Error()) + logger.Infof("casbin rbac_model or policy init error, message: %v \r\n", err.Error()) return nil, err } } diff --git a/pkg/cronjob/testjob.go b/pkg/cronjob/testjob.go index f6bdb27..6aa0fc2 100644 --- a/pkg/cronjob/testjob.go +++ b/pkg/cronjob/testjob.go @@ -1,19 +1,20 @@ package cronjob import ( + "ferry/pkg/logger" + "github.com/robfig/cron/v3" - log "github.com/sirupsen/logrus" ) func TestJob(c *cron.Cron) { id, err := c.AddFunc("1 * * * *", func() { - log.Println("Every hour on the one hour") + logger.Info("Every hour on the one hour") }) if err != nil { - log.Println(err) - log.Println("start error") + logger.Info(err) + logger.Info("start error") } else { - log.Printf("Start Success; ID: %v \r\n", id) + logger.Infof("Start Success; ID: %v \r\n", id) } } diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index 4b27585..f72730c 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -1,13 +1,121 @@ +/* + @Author : lanyulei +*/ + package logger import ( - log "github.com/sirupsen/logrus" + "os" + "time" + + "gopkg.in/natefinch/lumberjack.v2" + + "github.com/spf13/viper" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" ) -var ( - Info *log.Logger - Warning *log.Logger - Error * log.Logger -) +// error logger +var log *zap.SugaredLogger +var levelMap = map[string]zapcore.Level{ + "debug": zapcore.DebugLevel, + "info": zapcore.InfoLevel, + "warn": zapcore.WarnLevel, + "error": zapcore.ErrorLevel, + "dpanic": zapcore.DPanicLevel, + "panic": zapcore.PanicLevel, + "fatal": zapcore.FatalLevel, +} +func Init() { + var syncWriters []zapcore.WriteSyncer + level := getLoggerLevel(viper.GetString(`settings.log.level`)) + fileConfig := &lumberjack.Logger{ + Filename: viper.GetString(`settings.log.path`), // 日志文件名 + MaxSize: viper.GetInt(`settings.log.maxsize`), // 日志文件大小 + MaxAge: viper.GetInt(`settings.log.maxAge`), // 最长保存天数 + MaxBackups: viper.GetInt(`settings.log.maxBackups`), // 最多备份几个 + LocalTime: viper.GetBool(`settings.log.localtime`), // 日志时间戳 + Compress: viper.GetBool(`settings.log.compress`), // 是否压缩文件,使用gzip + } + encoder := zap.NewProductionEncoderConfig() + encoder.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { + enc.AppendString(t.Format("2006-01-02 15:04:05.000000")) + } + if viper.GetBool("settings.log.consoleStdout") { + syncWriters = append(syncWriters, zapcore.AddSync(os.Stdout)) + } + if viper.GetBool("settings.log.fileStdout") { + syncWriters = append(syncWriters, zapcore.AddSync(fileConfig)) + } + core := zapcore.NewCore( + zapcore.NewJSONEncoder(encoder), + zapcore.NewMultiWriteSyncer(syncWriters...), + zap.NewAtomicLevelAt(level)) + logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1)) + log = logger.Sugar() +} + +func getLoggerLevel(lvl string) zapcore.Level { + if level, ok := levelMap[lvl]; ok { + return level + } + return zapcore.InfoLevel +} + +func Debug(args ...interface{}) { + log.Debug(args...) +} + +func Debugf(format string, args ...interface{}) { + log.Debugf(format, args...) +} + +func Info(args ...interface{}) { + log.Info(args...) +} + +func Infof(format string, args ...interface{}) { + log.Infof(format, args...) +} + +func Warn(args ...interface{}) { + log.Warn(args...) +} + +func Warnf(format string, args ...interface{}) { + log.Warnf(format, args...) +} + +func Error(args ...interface{}) { + log.Error(args...) +} + +func Errorf(format string, args ...interface{}) { + log.Errorf(format, args...) +} + +func DPanic(args ...interface{}) { + log.DPanic(args...) +} + +func DPanicf(format string, args ...interface{}) { + log.DPanicf(format, args...) +} + +func Panic(args ...interface{}) { + log.Panic(args...) +} + +func Panicf(format string, args ...interface{}) { + log.Panicf(format, args...) +} + +func Fatal(args ...interface{}) { + log.Fatal(args...) +} + +func Fatalf(format string, args ...interface{}) { + log.Fatalf(format, args...) +} diff --git a/pkg/notify/email/email.go b/pkg/notify/email/email.go index 09daa18..1b26190 100644 --- a/pkg/notify/email/email.go +++ b/pkg/notify/email/email.go @@ -6,11 +6,11 @@ package email */ import ( + "ferry/pkg/logger" "strconv" "github.com/spf13/viper" - log "github.com/sirupsen/logrus" "gopkg.in/gomail.v2" ) @@ -41,8 +41,8 @@ func server(mailTo []string, subject, body string, args ...string) error { func SendMail(mailTo []string, subject, body string) { err := server(mailTo, subject, body) if err != nil { - log.Println(err) + logger.Info(err) return } - log.Println("send successfully") + logger.Info("send successfully") } diff --git a/pkg/notify/send.go b/pkg/notify/send.go index 032c6e8..ab2c5f6 100644 --- a/pkg/notify/send.go +++ b/pkg/notify/send.go @@ -3,12 +3,11 @@ package notify import ( "bytes" "ferry/models/system" + "ferry/pkg/logger" "ferry/pkg/notify/email" "text/template" "github.com/spf13/viper" - - log "github.com/sirupsen/logrus" ) /* @@ -78,7 +77,7 @@ func (b *BodyData) SendNotify() (err error) { } err = b.ParsingTemplate() if err != nil { - log.Errorf("模版内容解析失败,%v", err.Error()) + logger.Errorf("模版内容解析失败,%v", err.Error()) return } go email.SendMail(emailList, b.Subject, b.Content) diff --git a/pkg/pagination/pagination.go b/pkg/pagination/pagination.go index da78d28..865c9fc 100644 --- a/pkg/pagination/pagination.go +++ b/pkg/pagination/pagination.go @@ -5,11 +5,10 @@ package pagination */ import ( + "ferry/pkg/logger" "fmt" "math" - "github.com/RichardKnop/machinery/v1/log" - "github.com/gin-gonic/gin" "github.com/jinzhu/gorm" ) @@ -45,7 +44,7 @@ func Paging(p *Param, result interface{}, args ...interface{}) (*Paginator, erro ) if err := p.C.Bind(¶m); err != nil { - log.ERROR.Printf("参数绑定失败,错误:%v", err) + logger.Errorf("参数绑定失败,错误:%v", err) return nil, err } @@ -97,7 +96,7 @@ func Paging(p *Param, result interface{}, args ...interface{}) (*Paginator, erro err := db.Limit(param.PerPage).Offset(offset).Scan(result).Error if err != nil { - log.ERROR.Printf("数据查询失败,错误:%v", err) + logger.Errorf("数据查询失败,错误:%v", err) return nil, err } <-done diff --git a/pkg/pagination/params.go b/pkg/pagination/params.go index 449730a..2ed05a6 100644 --- a/pkg/pagination/params.go +++ b/pkg/pagination/params.go @@ -1,7 +1,7 @@ package pagination import ( - "github.com/RichardKnop/machinery/v1/log" + "ferry/pkg/logger" "github.com/gin-gonic/gin" ) @@ -15,7 +15,7 @@ func RequestParams(c *gin.Context) map[string]interface{} { if c.Request.Form == nil { if err := c.Request.ParseMultipartForm(32 << 20); err != nil { - log.ERROR.Println(err) + logger.Error(err) } } diff --git a/pkg/task/server.go b/pkg/task/server.go index 4ced886..0ff8812 100644 --- a/pkg/task/server.go +++ b/pkg/task/server.go @@ -5,9 +5,8 @@ package task */ import ( + "ferry/pkg/logger" "ferry/pkg/task/worker" - - "github.com/RichardKnop/machinery/v1/log" ) func Start() { @@ -15,6 +14,6 @@ func Start() { taskWorker := worker.NewAsyncTaskWorker(0) err := taskWorker.Launch() if err != nil { - log.ERROR.Println("启动machinery失败,%v", err.Error()) + logger.Errorf("启动machinery失败,%v", err.Error()) } } diff --git a/pkg/task/worker/tasks.go b/pkg/task/worker/tasks.go index 27c02a3..42cdcf5 100644 --- a/pkg/task/worker/tasks.go +++ b/pkg/task/worker/tasks.go @@ -2,10 +2,10 @@ package worker import ( "context" + "ferry/pkg/logger" "os/exec" "syscall" - "github.com/RichardKnop/machinery/v1/log" "github.com/RichardKnop/machinery/v1/tasks" ) @@ -15,30 +15,30 @@ func executeTaskBase(scriptPath string) { command := exec.Command("/bin/bash", "-c", scriptPath) //初始化Cmd err := command.Start() //运行脚本 if nil != err { - log.ERROR.Printf("task exec failed,%v", err.Error()) + logger.Errorf("task exec failed,%v", err.Error()) return } - log.INFO.Println("Process PID:", command.Process.Pid) + logger.Info("Process PID:", command.Process.Pid) err = command.Wait() //等待执行完成 if nil != err { - log.ERROR.Printf("task exec failed,%v", err.Error()) + logger.Errorf("task exec failed,%v", err.Error()) return } - log.INFO.Println("ProcessState PID:", command.ProcessState.Pid()) - log.INFO.Println("Exit Code", command.ProcessState.Sys().(syscall.WaitStatus).ExitStatus()) + logger.Info("ProcessState PID:", command.ProcessState.Pid()) + logger.Info("Exit Code", command.ProcessState.Sys().(syscall.WaitStatus).ExitStatus()) } // ExecCommand 异步任务 func ExecCommand(classify string, scriptPath string) error { if classify == "shell" { - log.INFO.Println("start exec shell...", scriptPath) + logger.Info("start exec shell...", scriptPath) executeTaskBase(scriptPath) return nil } else if classify == "python" { - log.INFO.Println("start exec python...", scriptPath) + logger.Info("start exec python...", scriptPath) executeTaskBase(scriptPath) return nil } @@ -61,7 +61,7 @@ func SendTask(ctx context.Context, classify string, scriptPath string) { task.RetryCount = 5 _, err := AsyncTaskCenter.SendTaskWithContext(ctx, task) if err != nil { - log.ERROR.Println(err.Error()) + logger.Error(err.Error()) } } diff --git a/pkg/task/worker/worker.go b/pkg/task/worker/worker.go index f52cb49..9f07761 100644 --- a/pkg/task/worker/worker.go +++ b/pkg/task/worker/worker.go @@ -1,9 +1,10 @@ package worker import ( + "ferry/pkg/logger" + "github.com/RichardKnop/machinery/v1" taskConfig "github.com/RichardKnop/machinery/v1/config" - "github.com/RichardKnop/machinery/v1/log" "github.com/RichardKnop/machinery/v1/tasks" ) @@ -35,13 +36,13 @@ func NewAsyncTaskWorker(concurrency int) *machinery.Worker { consumerTag := "TaskWorker" worker := AsyncTaskCenter.NewWorker(consumerTag, concurrency) errorHandler := func(err error) { - log.ERROR.Println("执行失败: ", err) + logger.Error("执行失败: ", err) } preTaskHandler := func(signature *tasks.Signature) { - log.INFO.Println("开始执行: ", signature.Name) + logger.Info("开始执行: ", signature.Name) } postTaskHandler := func(signature *tasks.Signature) { - log.INFO.Println("执行结束: ", signature.Name) + logger.Info("执行结束: ", signature.Name) } worker.SetPostTaskHandler(postTaskHandler) worker.SetErrorHandler(errorHandler) diff --git a/tools/app/return.go b/tools/app/return.go index 9977401..20181d6 100644 --- a/tools/app/return.go +++ b/tools/app/return.go @@ -1,10 +1,10 @@ package app import ( + "ferry/pkg/logger" "net/http" "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" ) // 失败数据处理 @@ -14,7 +14,7 @@ func Error(c *gin.Context, code int, err error, msg string) { if msg != "" { res.Msg = msg } - log.Error(res.Msg) + logger.Error(res.Msg) c.JSON(http.StatusOK, res.ReturnError(code)) } diff --git a/tools/config/config.go b/tools/config/config.go index ce50784..17fe33e 100644 --- a/tools/config/config.go +++ b/tools/config/config.go @@ -1,70 +1,68 @@ package config import ( + "ferry/pkg/logger" "fmt" - log "github.com/sirupsen/logrus" - "github.com/spf13/viper" "io/ioutil" "os" "strings" + + "github.com/spf13/viper" ) var cfgDatabase *viper.Viper var cfgApplication *viper.Viper var cfgJwt *viper.Viper -var cfgLog *viper.Viper var cfgSsl *viper.Viper - //载入配置文件 func ConfigSetup(path string) { viper.SetConfigFile(path) content, err := ioutil.ReadFile(path) if err != nil { - log.Fatal(fmt.Sprintf("Read config file fail: %s", err.Error())) + logger.Fatal(fmt.Sprintf("Read config file fail: %s", err.Error())) } - //Replace environment variables err = viper.ReadConfig(strings.NewReader(os.ExpandEnv(string(content)))) if err != nil { - log.Fatal(fmt.Sprintf("Parse config file fail: %s", err.Error())) + logger.Fatal(fmt.Sprintf("Parse config file fail: %s", err.Error())) } + // 数据库初始化 cfgDatabase = viper.Sub("settings.database") if cfgDatabase == nil { panic("config not found settings.database") } DatabaseConfig = InitDatabase(cfgDatabase) + // 启动参数 cfgApplication = viper.Sub("settings.application") if cfgApplication == nil { panic("config not found settings.application") } ApplicationConfig = InitApplication(cfgApplication) + // Jwt初始化 cfgJwt = viper.Sub("settings.jwt") if cfgJwt == nil { panic("config not found settings.jwt") } JwtConfig = InitJwt(cfgJwt) - cfgLog = viper.Sub("settings.log") - if cfgLog == nil { - panic("config not found settings.log") - } - LogConfig = InitLog(cfgLog) - + // ssl 配置 cfgSsl = viper.Sub("settings.ssl") if cfgSsl == nil { panic("config not found settings.ssl") } SslConfig = InitSsl(cfgSsl) -} + // 日志配置 + logger.Init() +} func SetConfig(configPath string, key string, value interface{}) { viper.AddConfigPath(configPath) viper.Set(key, value) - viper.WriteConfig() + _ = viper.WriteConfig() } diff --git a/tools/config/log.go b/tools/config/log.go deleted file mode 100644 index cc537e5..0000000 --- a/tools/config/log.go +++ /dev/null @@ -1,17 +0,0 @@ -package config - -import "github.com/spf13/viper" - -type Log struct { - Dir string - Operdb bool -} - -func InitLog(cfg *viper.Viper) *Log { - return &Log{ - Dir: cfg.GetString("dir"), - Operdb: cfg.GetBool("operdb"), - } -} - -var LogConfig = new(Log) diff --git a/tools/logger.go b/tools/logger.go deleted file mode 100644 index 01002ab..0000000 --- a/tools/logger.go +++ /dev/null @@ -1,62 +0,0 @@ -package tools - -import ( - "errors" - config2 "ferry/tools/config" - "os" - "time" - - log "github.com/sirupsen/logrus" -) - -func InitLogger() { - log.SetFormatter(&log.TextFormatter{FieldMap: log.FieldMap{ - log.FieldKeyTime: "@timestamp", - log.FieldKeyLevel: "@level", - log.FieldKeyMsg: "@message"}}) - - switch Mode(config2.ApplicationConfig.Mode) { - case ModeDev, ModeTest: - log.SetOutput(os.Stdout) - log.SetLevel(log.TraceLevel) - case ModeProd: - file, err := os.OpenFile(config2.LogConfig.Dir+"/api-"+time.Now().Format("2006-01-02")+".log", os.O_WRONLY|os.O_APPEND|os.O_CREATE|os.O_SYNC, 0600) - if err != nil { - log.Fatalln("log init failed") - } - - var info os.FileInfo - info, err = file.Stat() - if err != nil { - log.Fatal(err) - } - fileWriter := logFileWriter{file, info.Size()} - log.SetOutput(&fileWriter) - log.SetLevel(log.WarnLevel) - } - - log.SetReportCaller(true) -} - -type logFileWriter struct { - file *os.File - size int64 -} - -func (p *logFileWriter) Write(data []byte) (n int, err error) { - if p == nil { - return 0, errors.New("logFileWriter is nil") - } - if p.file == nil { - return 0, errors.New("file not opened") - } - n, e := p.file.Write(data) - p.size += int64(n) - //每天一个文件 - if p.file.Name() != config2.LogConfig.Dir+"/api-"+time.Now().Format("2006-01-02")+".log" { - _ = p.file.Close() - p.file, _ = os.OpenFile(config2.LogConfig.Dir+"/api-"+time.Now().Format("2006-01-02")+".log", os.O_WRONLY|os.O_APPEND|os.O_CREATE|os.O_SYNC, 0600) - p.size = 0 - } - return n, e -} diff --git a/tools/user.go b/tools/user.go index bbf086c..7dfe42c 100644 --- a/tools/user.go +++ b/tools/user.go @@ -2,10 +2,10 @@ package tools import ( jwt "ferry/pkg/jwtauth" + "ferry/pkg/logger" "fmt" "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" ) func ExtractClaims(c *gin.Context) jwt.MapClaims { @@ -22,7 +22,7 @@ func GetUserId(c *gin.Context) int { if data["identity"] != nil { return int((data["identity"]).(float64)) } - log.Println("********** 路径:" + c.Request.URL.Path + " 请求方法:" + c.Request.Method + " 说明:缺少identity") + logger.Info("********** 路径:" + c.Request.URL.Path + " 请求方法:" + c.Request.Method + " 说明:缺少identity") return 0 } @@ -31,7 +31,7 @@ func GetUserIdStr(c *gin.Context) string { if data["identity"] != nil { return Int64ToString(int64((data["identity"]).(float64))) } - log.Println("********** 路径:" + c.Request.URL.Path + " 请求方法:" + c.Request.Method + " 缺少identity") + logger.Info("********** 路径:" + c.Request.URL.Path + " 请求方法:" + c.Request.Method + " 缺少identity") return "" } diff --git a/tools/utils.go b/tools/utils.go index e048917..5ab91bd 100644 --- a/tools/utils.go +++ b/tools/utils.go @@ -1,9 +1,10 @@ package tools import ( - log "github.com/sirupsen/logrus" - "golang.org/x/crypto/bcrypt" + "ferry/pkg/logger" "strconv" + + "golang.org/x/crypto/bcrypt" ) func StrToInt(err error, index string) int { @@ -17,7 +18,7 @@ func StrToInt(err error, index string) int { func CompareHashAndPassword(e string, p string) (bool, error) { err := bcrypt.CompareHashAndPassword([]byte(e), []byte(p)) if err != nil { - log.Print(err.Error()) + logger.Info(err.Error()) return false, err } return true, nil @@ -49,7 +50,7 @@ func HasError(err error, msg string, code ...int) { if msg == "" { msg = err.Error() } - log.Println(err) + logger.Info(err) panic("CustomError#" + strconv.Itoa(statusCode) + "#" + msg) } }