diff --git a/app/admin/apis/system/role.go b/app/admin/apis/system/role.go index 8b42af29..8a97c045 100644 --- a/app/admin/apis/system/role.go +++ b/app/admin/apis/system/role.go @@ -2,9 +2,9 @@ package system import ( "github.com/gin-gonic/gin" - mycasbin "go-admin/pkg/casbin" "go-admin/app/admin/models" + "go-admin/common/global" "go-admin/tools" "go-admin/tools/app" ) @@ -88,7 +88,7 @@ func InsertRole(c *gin.Context) { tools.HasError(err, "", -1) } - _, err = mycasbin.LoadPolicy() + _, err = global.LoadPolicy() tools.HasError(err, "", -1) app.OK(c, data, "添加成功") @@ -118,7 +118,7 @@ func UpdateRole(c *gin.Context) { tools.HasError(err2, "修改失败(insert)", -1) } - _, err = mycasbin.LoadPolicy() + _, err = global.LoadPolicy() tools.HasError(err, "", -1) app.OK(c, result, "修改成功") @@ -156,7 +156,7 @@ func DeleteRole(c *gin.Context) { _, err := Role.BatchDelete(IDS) tools.HasError(err, "删除失败", -1) - _, err = mycasbin.LoadPolicy() + _, err = global.LoadPolicy() tools.HasError(err, "", -1) app.OK(c, "", "删除成功") diff --git a/app/admin/middleware/permission.go b/app/admin/middleware/permission.go index e3c2be17..6d8e3037 100644 --- a/app/admin/middleware/permission.go +++ b/app/admin/middleware/permission.go @@ -1,15 +1,15 @@ package middleware import ( - "go-admin/common/log" - "go-admin/tools/app" "net/http" "github.com/gin-gonic/gin" - mycasbin "go-admin/pkg/casbin" + "go-admin/common/global" + "go-admin/common/log" "go-admin/pkg/jwtauth" "go-admin/tools" + "go-admin/tools/app" ) //权限检查中间件 @@ -17,15 +17,15 @@ func AuthCheckRole() gin.HandlerFunc { return func(c *gin.Context) { data, _ := c.Get(jwtauth.JwtPayloadKey) v := data.(jwtauth.MapClaims) - e := mycasbin.Casbin() + e := global.CasbinEnforcer var res bool var err error msgID := tools.GenerateMsgIDFromContext(c) //检查权限 - if v["rolekey"]=="admin" { + if v["rolekey"] == "admin" { res = true log.Infof("msgID[%s] info:%s method:%s path:%s", msgID, v["rolekey"], c.Request.Method, c.Request.URL.Path) - }else { + } else { res, err = e.Enforce(v["rolekey"], c.Request.URL.Path, c.Request.Method) if err != nil { log.Errorf("msgID[%s] error:%s method:%s path:%s", msgID, err, c.Request.Method, c.Request.URL.Path) diff --git a/cmd/api/server.go b/cmd/api/server.go index b0c6e349..3d2a023e 100644 --- a/cmd/api/server.go +++ b/cmd/api/server.go @@ -17,6 +17,7 @@ import ( "go-admin/app/jobs" "go-admin/common/database" "go-admin/common/global" + "go-admin/common/log" mycasbin "go-admin/pkg/casbin" "go-admin/pkg/logger" "go-admin/tools" @@ -57,14 +58,14 @@ func setup() { //1. 读取配置 config.Setup(configYml) //2. 设置日志 - logger.Setup() + global.Logger, global.JobLogger, global.RequestLogger = logger.Setup() //3. 初始化数据库链接 database.Setup(config.DatabaseConfig.Driver) //4. 接口访问控制加载 - mycasbin.Setup() + global.CasbinEnforcer = mycasbin.Setup(global.Eloquent, "sys_") usageStr := `starting api server` - global.Logger.Info(usageStr) + log.Info(usageStr) } @@ -100,11 +101,11 @@ func run() error { // 服务连接 if config.SslConfig.Enable { if err := srv.ListenAndServeTLS(config.SslConfig.Pem, config.SslConfig.KeyStr); err != nil && err != http.ErrServerClosed { - global.Logger.Fatal("listen: ", err) + log.Fatal("listen: ", err) } } else { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { - global.Logger.Fatal("listen: ", err) + log.Fatal("listen: ", err) } } }() @@ -127,9 +128,9 @@ func run() error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { - global.Logger.Fatal("Server Shutdown:", err) + log.Fatal("Server Shutdown:", err) } - global.Logger.Println("Server exiting") + log.Info("Server exiting") return nil } diff --git a/cmd/migrate/migration/version/1599190683659_tables.go b/cmd/migrate/migration/version/1599190683659_tables.go index e759747a..1306553f 100644 --- a/cmd/migrate/migration/version/1599190683659_tables.go +++ b/cmd/migrate/migration/version/1599190683659_tables.go @@ -1,9 +1,9 @@ package version import ( - "go-admin/app/admin/models/system" "runtime" + "go-admin/app/admin/models/system" "gorm.io/gorm" "go-admin/app/admin/models" diff --git a/cmd/migrate/migration/version/1599190683670_migrate.go b/cmd/migrate/migration/version/1599190683670_migrate.go index 88354204..82711794 100644 --- a/cmd/migrate/migration/version/1599190683670_migrate.go +++ b/cmd/migrate/migration/version/1599190683670_migrate.go @@ -1,13 +1,13 @@ package version import ( - "go-admin/app/admin/models/system" "runtime" "time" "gorm.io/gorm" "go-admin/app/admin/models" + "go-admin/app/admin/models/system" "go-admin/cmd/migrate/migration" common "go-admin/common/models" ) diff --git a/cmd/migrate/migration/version/1602644950000_migrate.go b/cmd/migrate/migration/version/1602644950000_migrate.go index a73d1471..c2f87cee 100644 --- a/cmd/migrate/migration/version/1602644950000_migrate.go +++ b/cmd/migrate/migration/version/1602644950000_migrate.go @@ -1,11 +1,12 @@ package version import ( - "go-admin/app/admin/models" - "go-admin/app/admin/models/system" - "gorm.io/gorm" "runtime" + "gorm.io/gorm" + + "go-admin/app/admin/models" + "go-admin/app/admin/models/system" "go-admin/cmd/migrate/migration" common "go-admin/common/models" ) diff --git a/cmd/migrate/server.go b/cmd/migrate/server.go index 08850a86..a5b05435 100644 --- a/cmd/migrate/server.go +++ b/cmd/migrate/server.go @@ -16,7 +16,7 @@ import ( "go-admin/common/global" "go-admin/common/models" "go-admin/pkg/logger" - tools2 "go-admin/tools" + "go-admin/tools" "go-admin/tools/config" ) @@ -48,7 +48,7 @@ func run() { //1. 读取配置 config.Setup(configYml) //2. 设置日志 - logger.Setup() + global.Logger, global.JobLogger, global.RequestLogger = logger.Setup() _ = initDB() } else { _ = genFile() @@ -91,9 +91,9 @@ func genFile() error { var b1 bytes.Buffer err = t1.Execute(&b1, m) if goAdmin { - tools2.FileCreate(b1, "./cmd/migrate/migration/version/"+m["GenerateTime"]+"_migrate.go") + tools.FileCreate(b1, "./cmd/migrate/migration/version/"+m["GenerateTime"]+"_migrate.go") } else { - tools2.FileCreate(b1, "./cmd/migrate/migration/version-local/"+m["GenerateTime"]+"_migrate.go") + tools.FileCreate(b1, "./cmd/migrate/migration/version-local/"+m["GenerateTime"]+"_migrate.go") } return nil } diff --git a/cmd/version/server.go b/cmd/version/server.go index cb46e41d..1095bb1f 100644 --- a/cmd/version/server.go +++ b/cmd/version/server.go @@ -9,10 +9,7 @@ import ( ) var ( - configYml string - port string - mode string - StartCmd = &cobra.Command{ + StartCmd = &cobra.Command{ Use: "version", Short: "Get version info", Example: "go-admin version", diff --git a/common/config/config.go b/common/config/config.go index 4ac318dd..5222d114 100644 --- a/common/config/config.go +++ b/common/config/config.go @@ -4,7 +4,7 @@ import ( "database/sql" "net/http" - "go-admin/logger" + "github.com/go-admin-team/go-admin-core/logger" ) type Config struct { diff --git a/common/config/type.go b/common/config/type.go index 8fbed122..a8060a62 100644 --- a/common/config/type.go +++ b/common/config/type.go @@ -3,7 +3,7 @@ package config import ( "net/http" - "go-admin/logger" + "github.com/go-admin-team/go-admin-core/logger" ) type Conf interface { diff --git a/common/database/mysql_drive.go b/common/database/mysql_drive.go index 6ed0b294..c30d7a2b 100644 --- a/common/database/mysql_drive.go +++ b/common/database/mysql_drive.go @@ -2,7 +2,7 @@ package database import ( "database/sql" - "log" + . "log" "time" "gorm.io/driver/mysql" @@ -10,9 +10,10 @@ import ( "gorm.io/gorm/logger" "gorm.io/gorm/schema" + goAdminLogger "github.com/go-admin-team/go-admin-core/logger" "go-admin/common/config" "go-admin/common/global" - goAdminLogger "go-admin/logger" + "go-admin/common/log" "go-admin/tools" toolsConfig "go-admin/tools/config" ) @@ -22,10 +23,10 @@ type Mysql struct { func (e *Mysql) Setup() { global.Source = e.GetConnect() - global.Logger.Info(tools.Green(global.Source)) + log.Info(tools.Green(global.Source)) db, err := sql.Open("mysql", global.Source) if err != nil { - global.Logger.Fatal(tools.Red(e.GetDriver()+" connect error :"), err) + log.Fatal(tools.Red(e.GetDriver()+" connect error :"), err) } global.Cfg.SetDb(&config.DBConfig{ Driver: "mysql", @@ -37,18 +38,18 @@ func (e *Mysql) Setup() { }, }) if err != nil { - global.Logger.Fatal(tools.Red(e.GetDriver()+" connect error :"), err) + log.Fatal(tools.Red(e.GetDriver()+" connect error :"), err) } else { - global.Logger.Info(tools.Green(e.GetDriver() + " connect success !")) + log.Info(tools.Green(e.GetDriver() + " connect success !")) } if global.Eloquent.Error != nil { - global.Logger.Fatal(tools.Red(" database error :"), global.Eloquent.Error) + log.Fatal(tools.Red(" database error :"), global.Eloquent.Error) } if toolsConfig.LoggerConfig.EnabledDB { global.Eloquent.Logger = logger.New( - log.New(goAdminLogger.DefaultLogger.Options().Out, "\r\n", log.LstdFlags), + New(goAdminLogger.DefaultLogger.Options().Out, "\r\n", LstdFlags), logger.Config{ SlowThreshold: time.Second, Colorful: true, diff --git a/common/database/pgsql_driver.go b/common/database/pgsql_driver.go index e6b0c0bb..b1d9bead 100644 --- a/common/database/pgsql_driver.go +++ b/common/database/pgsql_driver.go @@ -2,7 +2,8 @@ package database import ( "database/sql" - "log" + "go-admin/common/log" + . "log" "time" "gorm.io/driver/postgres" @@ -10,9 +11,9 @@ import ( "gorm.io/gorm/logger" "gorm.io/gorm/schema" + goAdminLogger "github.com/go-admin-team/go-admin-core/logger" "go-admin/common/config" "go-admin/common/global" - goAdminLogger "go-admin/logger" "go-admin/tools" toolsConfig "go-admin/tools/config" ) @@ -24,7 +25,7 @@ func (e *PgSql) Setup() { var err error global.Source = e.GetConnect() - log.Println(global.Source) + log.Info(global.Source) db, err := sql.Open("postgresql", global.Source) if err != nil { global.Logger.Fatal(tools.Red(e.GetDriver()+" connect error :"), err) @@ -41,7 +42,7 @@ func (e *PgSql) Setup() { if err != nil { log.Fatalf("%s connect error %v", e.GetDriver(), err) } else { - log.Printf("%s connect success!", e.GetDriver()) + log.Infof("%s connect success!", e.GetDriver()) } if global.Eloquent.Error != nil { @@ -50,7 +51,7 @@ func (e *PgSql) Setup() { if toolsConfig.LoggerConfig.EnabledDB { global.Eloquent.Logger = logger.New( - log.New(goAdminLogger.DefaultLogger.Options().Out, "\r\n", log.LstdFlags), + New(goAdminLogger.DefaultLogger.Options().Out, "\r\n", LstdFlags), logger.Config{ SlowThreshold: time.Second, Colorful: true, diff --git a/common/database/sqlite3_driver.go b/common/database/sqlite3_driver.go index a02d5324..c7fb5173 100644 --- a/common/database/sqlite3_driver.go +++ b/common/database/sqlite3_driver.go @@ -4,7 +4,7 @@ package database import ( "database/sql" - "log" + . "log" "os" "time" @@ -15,6 +15,7 @@ import ( "go-admin/common/config" "go-admin/common/global" + "go-admin/common/log" "go-admin/tools" toolsConfig "go-admin/tools/config" ) @@ -26,7 +27,7 @@ func (e *SqLite) Setup() { var err error global.Source = e.GetConnect() - log.Println(global.Source) + log.Info(global.Source) db, err := sql.Open("sqlite3", global.Source) if err != nil { global.Logger.Fatal(tools.Red(e.GetDriver()+" connect error :"), err) @@ -44,7 +45,7 @@ func (e *SqLite) Setup() { if err != nil { log.Fatalf("%s connect error %v", e.GetDriver(), err) } else { - log.Printf("%s connect success!", e.GetDriver()) + log.Infof("%s connect success!", e.GetDriver()) } if global.Eloquent.Error != nil { @@ -52,11 +53,13 @@ func (e *SqLite) Setup() { } if toolsConfig.LoggerConfig.EnabledDB { - global.Eloquent.Logger = logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{ - SlowThreshold: time.Second, - Colorful: true, - LogLevel: logger.Info, - }) + global.Eloquent.Logger = logger.New( + New(os.Stdout, "\r\n", LstdFlags), logger.Config{ + SlowThreshold: time.Second, + Colorful: true, + LogLevel: logger.Info, + }, + ) } } diff --git a/common/global/adm.go b/common/global/adm.go index 73804827..dc1a4142 100644 --- a/common/global/adm.go +++ b/common/global/adm.go @@ -5,8 +5,9 @@ import ( "github.com/gin-gonic/gin" "github.com/gogf/gf/os/glog" "github.com/robfig/cron/v3" - "go-admin/common/config" "gorm.io/gorm" + + "go-admin/common/config" ) const ( diff --git a/common/global/casbin.go b/common/global/casbin.go new file mode 100644 index 00000000..bbe300fe --- /dev/null +++ b/common/global/casbin.go @@ -0,0 +1,15 @@ +package global + +import ( + "github.com/casbin/casbin/v2" + "github.com/casbin/casbin/v2/log" +) + +func LoadPolicy() (*casbin.SyncedEnforcer, error) { + if err := CasbinEnforcer.LoadPolicy(); err == nil { + return CasbinEnforcer, err + } else { + log.LogPrintf("casbin rbac_model or policy init error, message: %v \r\n", err.Error()) + return nil, err + } +} diff --git a/common/log/log.go b/common/log/log.go index 42e1866d..83636e23 100644 --- a/common/log/log.go +++ b/common/log/log.go @@ -1,6 +1,6 @@ package log -import "go-admin/logger" +import "github.com/go-admin-team/go-admin-core/logger" var ( // Trace trace级日志输出 diff --git a/debug/log/log.go b/debug/log/log.go deleted file mode 100644 index dabdb899..00000000 --- a/debug/log/log.go +++ /dev/null @@ -1,56 +0,0 @@ -// Package log provides debug logging -package log - -import ( - "encoding/json" - "fmt" - "time" -) - -var ( - // Default buffer size if any - DefaultSize = 256 - // Default formatter - DefaultFormat = TextFormat -) - -// Log is debug log interface for reading and writing logs -type Log interface { - // Read reads log entries from the logger - Read(...ReadOption) ([]Record, error) - // Write writes records to log - Write(Record) error - // Stream log records - Stream() (Stream, error) -} - -// Record is log record entry -type Record struct { - // Timestamp of logged event - Timestamp time.Time `json:"timestamp"` - // Metadata to enrich log record - Metadata map[string]string `json:"metadata"` - // Value contains log entry - Message interface{} `json:"message"` -} - -// Stream returns a log stream -type Stream interface { - Chan() <-chan Record - Stop() error -} - -// Format is a function which formats the output -type FormatFunc func(Record) string - -// TextFormat returns text format -func TextFormat(r Record) string { - t := r.Timestamp.Format("2006-01-02 15:04:05") - return fmt.Sprintf("%s %v", t, r.Message) -} - -// JSONFormat is a json Format func -func JSONFormat(r Record) string { - b, _ := json.Marshal(r) - return string(b) -} diff --git a/debug/log/options.go b/debug/log/options.go deleted file mode 100644 index 63281857..00000000 --- a/debug/log/options.go +++ /dev/null @@ -1,70 +0,0 @@ -package log - -import "time" - -// Option used by the logger -type Option func(*Options) - -// Options are logger options -type Options struct { - // Name of the log - Name string - // Size is the size of ring buffer - Size int - // Format specifies the output format - Format FormatFunc -} - -// Name of the log -func Name(n string) Option { - return func(o *Options) { - o.Name = n - } -} - -// Size sets the size of the ring buffer -func Size(s int) Option { - return func(o *Options) { - o.Size = s - } -} - -func Format(f FormatFunc) Option { - return func(o *Options) { - o.Format = f - } -} - -// DefaultOptions returns default options -func DefaultOptions() Options { - return Options{ - Size: DefaultSize, - } -} - -// ReadOptions for querying the logs -type ReadOptions struct { - // Since what time in past to return the logs - Since time.Time - // Count specifies number of logs to return - Count int - // Stream requests continuous log stream - Stream bool -} - -// ReadOption used for reading the logs -type ReadOption func(*ReadOptions) - -// Since sets the time since which to return the log records -func Since(s time.Time) ReadOption { - return func(o *ReadOptions) { - o.Since = s - } -} - -// Count sets the number of log records to return -func Count(c int) ReadOption { - return func(o *ReadOptions) { - o.Count = c - } -} diff --git a/examples/run.go b/examples/run.go index a70eb989..4b062384 100644 --- a/examples/run.go +++ b/examples/run.go @@ -20,8 +20,8 @@ func main() { if err != nil { panic(err) } - mycasbin.Setup() - logger.Setup() + global.CasbinEnforcer = mycasbin.Setup(global.Eloquent, "sys_") + global.Logger, global.JobLogger, global.RequestLogger = logger.Setup() global.GinEngine = gin.Default() //router.InitRouter() log.Fatal(global.GinEngine.Run(":8000")) diff --git a/go.mod b/go.mod index b3ab5d41..c9dfb70b 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/casbin/gorm-adapter/v3 v3.0.2 github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/gin-gonic/gin v1.6.3 - github.com/go-admin-team/go-admin-core v1.2.1 + github.com/go-admin-team/go-admin-core v1.2.2-0.20201026083717-3ca6060dfd3c github.com/go-redis/redis/v7 v7.4.0 github.com/go-sql-driver/mysql v1.5.0 github.com/gogf/gf v1.13.4 diff --git a/go.sum b/go.sum index be45e2c7..138ba792 100644 --- a/go.sum +++ b/go.sum @@ -187,8 +187,8 @@ github.com/git-chglog/git-chglog v0.0.0-20190923122001-6050f20bcdb0 h1:rdQovo0Jt github.com/git-chglog/git-chglog v0.0.0-20190923122001-6050f20bcdb0/go.mod h1:Dcsy1kii/xFyNad5JqY/d0GO5mu91sungp5xotbm3Yk= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-acme/lego/v3 v3.4.0/go.mod h1:xYbLDuxq3Hy4bMUT1t9JIuz6GWIWb3m5X+TeTHYaT7M= -github.com/go-admin-team/go-admin-core v1.2.1 h1:Ko9PSuQhi6YXA29iXYk8resTQ9iM46TjdHYZII0DZS4= -github.com/go-admin-team/go-admin-core v1.2.1/go.mod h1:uDLyMASlSXDnFD34V1U0w8tDaBdstc/JM3xhi+eGIEk= +github.com/go-admin-team/go-admin-core v1.2.2-0.20201026083717-3ca6060dfd3c h1:Ltad1Ux6Loha/wrv/KReJevMvPChYsqCRzkVBoW3Qkk= +github.com/go-admin-team/go-admin-core v1.2.2-0.20201026083717-3ca6060dfd3c/go.mod h1:uDLyMASlSXDnFD34V1U0w8tDaBdstc/JM3xhi+eGIEk= github.com/go-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= diff --git a/logger/context.go b/logger/context.go deleted file mode 100644 index 6940122d..00000000 --- a/logger/context.go +++ /dev/null @@ -1,14 +0,0 @@ -package logger - -import "context" - -type loggerKey struct{} - -func FromContext(ctx context.Context) (Logger, bool) { - l, ok := ctx.Value(loggerKey{}).(Logger) - return l, ok -} - -func NewContext(ctx context.Context, l Logger) context.Context { - return context.WithValue(ctx, loggerKey{}, l) -} diff --git a/logger/default.go b/logger/default.go deleted file mode 100644 index 0614a82b..00000000 --- a/logger/default.go +++ /dev/null @@ -1,194 +0,0 @@ -package logger - -import ( - "context" - "fmt" - "log" - "os" - "runtime" - "sort" - "strings" - "sync" - "time" - - dlog "go-admin/debug/log" -) - -func init() { - lvl, err := GetLevel(os.Getenv("GO_ADMIN_LOG_LEVEL")) - if err != nil { - lvl = InfoLevel - } - - DefaultLogger = NewHelper(NewLogger(WithLevel(lvl))) -} - -type defaultLogger struct { - sync.RWMutex - opts Options -} - -// Init(opts...) should only overwrite provided options -func (l *defaultLogger) Init(opts ...Option) error { - for _, o := range opts { - o(&l.opts) - } - return nil -} - -func (l *defaultLogger) String() string { - return "default" -} - -func (l *defaultLogger) Fields(fields map[string]interface{}) Logger { - l.Lock() - l.opts.Fields = copyFields(fields) - l.Unlock() - return l -} - -func copyFields(src map[string]interface{}) map[string]interface{} { - dst := make(map[string]interface{}, len(src)) - for k, v := range src { - dst[k] = v - } - return dst -} - -// logCallerfilePath returns a package/file:line description of the caller, -// preserving only the leaf directory name and file name. -func logCallerfilePath(loggingFilePath string) string { - // To make sure we trim the path correctly on Windows too, we - // counter-intuitively need to use '/' and *not* os.PathSeparator here, - // because the path given originates from Go stdlib, specifically - // runtime.Caller() which (as of Mar/17) returns forward slashes even on - // Windows. - // - // See https://github.com/golang/go/issues/3335 - // and https://github.com/golang/go/issues/18151 - // - // for discussion on the issue on Go side. - idx := strings.LastIndexByte(loggingFilePath, '/') - if idx == -1 { - return loggingFilePath - } - idx = strings.LastIndexByte(loggingFilePath[:idx], '/') - if idx == -1 { - return loggingFilePath - } - return loggingFilePath[idx+1:] -} - -func (l *defaultLogger) Log(level Level, v ...interface{}) { - // TODO decide does we need to write message if log level not used? - if !l.opts.Level.Enabled(level) { - return - } - - l.RLock() - fields := copyFields(l.opts.Fields) - l.RUnlock() - - fields["level"] = level.String() - - if _, file, line, ok := runtime.Caller(l.opts.CallerSkipCount); ok { - fields["file"] = fmt.Sprintf("%s:%d", logCallerfilePath(file), line) - } - - rec := dlog.Record{ - Timestamp: time.Now(), - Message: fmt.Sprint(v...), - Metadata: make(map[string]string, len(fields)), - } - - keys := make([]string, 0, len(fields)) - for k, v := range fields { - keys = append(keys, k) - rec.Metadata[k] = fmt.Sprintf("%v", v) - } - - sort.Strings(keys) - metadata := "" - - for _, k := range keys { - metadata += fmt.Sprintf(" %s=%v", k, fields[k]) - } - - t := rec.Timestamp.Format("2006-01-02 15:04:05") - _, err := l.opts.Out.Write([]byte(fmt.Sprintf("%s %s %v\n", t, metadata, rec.Message))) - if err != nil { - log.Printf("log [Log] write error: %s \n", err.Error()) - } - //fmt.Printf("%s %s %v\n", t, metadata, rec.Message) -} - -func (l *defaultLogger) Logf(level Level, format string, v ...interface{}) { - // TODO decide does we need to write message if log level not used? - if level < l.opts.Level { - return - } - - l.RLock() - fields := copyFields(l.opts.Fields) - l.RUnlock() - - fields["level"] = level.String() - - if _, file, line, ok := runtime.Caller(l.opts.CallerSkipCount); ok { - fields["file"] = fmt.Sprintf("%s:%d", logCallerfilePath(file), line) - } - - rec := dlog.Record{ - Timestamp: time.Now(), - Message: fmt.Sprintf(format, v...), - Metadata: make(map[string]string, len(fields)), - } - - keys := make([]string, 0, len(fields)) - for k, v := range fields { - keys = append(keys, k) - rec.Metadata[k] = fmt.Sprintf("%v", v) - } - - sort.Strings(keys) - metadata := "" - - for _, k := range keys { - metadata += fmt.Sprintf(" %s=%v", k, fields[k]) - } - - t := rec.Timestamp.Format("2006-01-02 15:04:05") - //fmt.Printf("%s %s %v\n", t, metadata, rec.Message) - _, err := l.opts.Out.Write([]byte(fmt.Sprintf("%s %s %v\n", t, metadata, rec.Message))) - if err != nil { - log.Printf("log [Logf] write error: %s \n", err.Error()) - } -} - -func (l *defaultLogger) Options() Options { - // not guard against options Context values - l.RLock() - opts := l.opts - opts.Fields = copyFields(l.opts.Fields) - l.RUnlock() - return opts -} - -// NewLogger builds a new logger based on options -func NewLogger(opts ...Option) Logger { - // Default options - options := Options{ - Level: InfoLevel, - Fields: make(map[string]interface{}), - Out: os.Stderr, - CallerSkipCount: 2, - Context: context.Background(), - } - - l := &defaultLogger{opts: options} - if err := l.Init(opts...); err != nil { - l.Log(FatalLevel, err) - } - - return l -} diff --git a/logger/helper.go b/logger/helper.go deleted file mode 100644 index 94c2f364..00000000 --- a/logger/helper.go +++ /dev/null @@ -1,114 +0,0 @@ -package logger - -import ( - "os" -) - -type Helper struct { - Logger - fields map[string]interface{} -} - -func NewHelper(log Logger) *Helper { - return &Helper{Logger: log} -} - -func (h *Helper) Info(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(InfoLevel) { - return - } - h.Logger.Fields(h.fields).Log(InfoLevel, args...) -} - -func (h *Helper) Infof(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(InfoLevel) { - return - } - h.Logger.Fields(h.fields).Logf(InfoLevel, template, args...) -} - -func (h *Helper) Trace(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(TraceLevel) { - return - } - h.Logger.Fields(h.fields).Log(TraceLevel, args...) -} - -func (h *Helper) Tracef(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(TraceLevel) { - return - } - h.Logger.Fields(h.fields).Logf(TraceLevel, template, args...) -} - -func (h *Helper) Debug(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(DebugLevel) { - return - } - h.Logger.Fields(h.fields).Log(DebugLevel, args...) -} - -func (h *Helper) Debugf(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(DebugLevel) { - return - } - h.Logger.Fields(h.fields).Logf(DebugLevel, template, args...) -} - -func (h *Helper) Warn(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(WarnLevel) { - return - } - h.Logger.Fields(h.fields).Log(WarnLevel, args...) -} - -func (h *Helper) Warnf(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(WarnLevel) { - return - } - h.Logger.Fields(h.fields).Logf(WarnLevel, template, args...) -} - -func (h *Helper) Error(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(ErrorLevel) { - return - } - h.Logger.Fields(h.fields).Log(ErrorLevel, args...) -} - -func (h *Helper) Errorf(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(ErrorLevel) { - return - } - h.Logger.Fields(h.fields).Logf(ErrorLevel, template, args...) -} - -func (h *Helper) Fatal(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(FatalLevel) { - return - } - h.Logger.Fields(h.fields).Log(FatalLevel, args...) - os.Exit(1) -} - -func (h *Helper) Fatalf(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(FatalLevel) { - return - } - h.Logger.Fields(h.fields).Logf(FatalLevel, template, args...) - os.Exit(1) -} - -func (h *Helper) WithError(err error) *Helper { - fields := copyFields(h.fields) - fields["error"] = err - return &Helper{Logger: h.Logger, fields: fields} -} - -func (h *Helper) WithFields(fields map[string]interface{}) *Helper { - nfields := copyFields(fields) - for k, v := range h.fields { - nfields[k] = v - } - return &Helper{Logger: h.Logger, fields: nfields} -} diff --git a/logger/level.go b/logger/level.go deleted file mode 100644 index 14bca250..00000000 --- a/logger/level.go +++ /dev/null @@ -1,140 +0,0 @@ -package logger - -import ( - "fmt" - "os" -) - -type Level int8 - -const ( - // TraceLevel level. Designates finer-grained informational events than the Debug. - TraceLevel Level = iota - 2 - // DebugLevel level. Usually only enabled when debugging. Very verbose logging. - DebugLevel - // InfoLevel is the default logging priority. - // General operational entries about what's going on inside the application. - InfoLevel - // WarnLevel level. Non-critical entries that deserve eyes. - WarnLevel - // ErrorLevel level. Logs. Used for errors that should definitely be noted. - ErrorLevel - // FatalLevel level. Logs and then calls `logger.Exit(1)`. highest level of severity. - FatalLevel -) - -func (l Level) String() string { - switch l { - case TraceLevel: - return "trace" - case DebugLevel: - return "debug" - case InfoLevel: - return "info" - case WarnLevel: - return "warn" - case ErrorLevel: - return "error" - case FatalLevel: - return "fatal" - } - return "" -} - -// LevelForGorm 转换成gorm日志级别 -func (l Level) LevelForGorm() int { - switch l { - case FatalLevel, ErrorLevel: - return 2 - case WarnLevel: - return 3 - case InfoLevel, DebugLevel, TraceLevel: - return 4 - default: - return 1 - } -} - -// Enabled returns true if the given level is at or above this level. -func (l Level) Enabled(lvl Level) bool { - return lvl >= l -} - -// GetLevel converts a level string into a logger Level value. -// returns an error if the input string does not match known values. -func GetLevel(levelStr string) (Level, error) { - switch levelStr { - case TraceLevel.String(): - return TraceLevel, nil - case DebugLevel.String(): - return DebugLevel, nil - case InfoLevel.String(): - return InfoLevel, nil - case WarnLevel.String(): - return WarnLevel, nil - case ErrorLevel.String(): - return ErrorLevel, nil - case FatalLevel.String(): - return FatalLevel, nil - } - return InfoLevel, fmt.Errorf("Unknown Level String: '%s', defaulting to InfoLevel", levelStr) -} - -func Info(args ...interface{}) { - DefaultLogger.Log(InfoLevel, args...) -} - -func Infof(template string, args ...interface{}) { - DefaultLogger.Logf(InfoLevel, template, args...) -} - -func Trace(args ...interface{}) { - DefaultLogger.Log(TraceLevel, args...) -} - -func Tracef(template string, args ...interface{}) { - DefaultLogger.Logf(TraceLevel, template, args...) -} - -func Debug(args ...interface{}) { - DefaultLogger.Log(DebugLevel, args...) -} - -func Debugf(template string, args ...interface{}) { - DefaultLogger.Logf(DebugLevel, template, args...) -} - -func Warn(args ...interface{}) { - DefaultLogger.Log(WarnLevel, args...) -} - -func Warnf(template string, args ...interface{}) { - DefaultLogger.Logf(WarnLevel, template, args...) -} - -func Error(args ...interface{}) { - DefaultLogger.Log(ErrorLevel, args...) -} - -func Errorf(template string, args ...interface{}) { - DefaultLogger.Logf(ErrorLevel, template, args...) -} - -func Fatal(args ...interface{}) { - DefaultLogger.Log(FatalLevel, args...) - os.Exit(1) -} - -func Fatalf(template string, args ...interface{}) { - DefaultLogger.Logf(FatalLevel, template, args...) - os.Exit(1) -} - -// Returns true if the given level is at or lower the current logger level -func V(lvl Level, log Logger) bool { - l := DefaultLogger - if log != nil { - l = log - } - return l.Options().Level <= lvl -} diff --git a/logger/logger.go b/logger/logger.go deleted file mode 100644 index 627f1ba9..00000000 --- a/logger/logger.go +++ /dev/null @@ -1,43 +0,0 @@ -// Package log provides a log interface -package logger - -var ( - // Default logger - DefaultLogger Logger -) - -// Logger is a generic logging interface -type Logger interface { - // Init initialises options - Init(options ...Option) error - // The Logger options - Options() Options - // Fields set fields to always be logged - Fields(fields map[string]interface{}) Logger - // Log writes a log entry - Log(level Level, v ...interface{}) - // Logf writes a formatted log entry - Logf(level Level, format string, v ...interface{}) - // String returns the name of logger - String() string -} - -func Init(opts ...Option) error { - return DefaultLogger.Init(opts...) -} - -func Fields(fields map[string]interface{}) Logger { - return DefaultLogger.Fields(fields) -} - -func Log(level Level, v ...interface{}) { - DefaultLogger.Log(level, v...) -} - -func Logf(level Level, format string, v ...interface{}) { - DefaultLogger.Logf(level, format, v...) -} - -func String() string { - return DefaultLogger.String() -} diff --git a/logger/logger_test.go b/logger/logger_test.go deleted file mode 100644 index f36a3a3b..00000000 --- a/logger/logger_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package logger - -import ( - "testing" -) - -func TestLogger(t *testing.T) { - l := NewLogger(WithLevel(TraceLevel)) - h1 := NewHelper(l).WithFields(map[string]interface{}{"key1": "val1"}) - h1.Trace("trace_msg1") - h1.Warn("warn_msg1") - - h2 := NewHelper(l).WithFields(map[string]interface{}{"key2": "val2"}) - h2.Trace("trace_msg2") - h2.Warn("warn_msg2") - - l.Fields(map[string]interface{}{"key3": "val4"}).Log(InfoLevel, "test_msg") -} diff --git a/logger/options.go b/logger/options.go deleted file mode 100644 index d0a03302..00000000 --- a/logger/options.go +++ /dev/null @@ -1,58 +0,0 @@ -package logger - -import ( - "context" - "io" -) - -type Option func(*Options) - -type Options struct { - // The logging level the logger should log at. default is `InfoLevel` - Level Level - // fields to always be logged - Fields map[string]interface{} - // It's common to set this to a file, or leave it default which is `os.Stderr` - Out io.Writer - // Caller skip frame count for file:line info - CallerSkipCount int - // Alternative options - Context context.Context -} - -// WithFields set default fields for the logger -func WithFields(fields map[string]interface{}) Option { - return func(args *Options) { - args.Fields = fields - } -} - -// WithLevel set default level for the logger -func WithLevel(level Level) Option { - return func(args *Options) { - args.Level = level - } -} - -// WithOutput set default output writer for the logger -func WithOutput(out io.Writer) Option { - return func(args *Options) { - args.Out = out - } -} - -// WithCallerSkipCount set frame count to skip -func WithCallerSkipCount(c int) Option { - return func(args *Options) { - args.CallerSkipCount = c - } -} - -func SetOption(k, v interface{}) Option { - return func(o *Options) { - if o.Context == nil { - o.Context = context.Background() - } - o.Context = context.WithValue(o.Context, k, v) - } -} diff --git a/pkg/casbin/log.go b/pkg/casbin/log.go new file mode 100644 index 00000000..f536ecbf --- /dev/null +++ b/pkg/casbin/log.go @@ -0,0 +1,36 @@ +package mycasbin + +import ( + "sync/atomic" + + "github.com/go-admin-team/go-admin-core/logger" +) + +// Logger is the implementation for a Logger using golang log. +type Logger struct { + enable int32 +} + +func (l *Logger) EnableLog(enable bool) { + i := 0 + if enable { + i = 1 + } + atomic.StoreInt32(&(l.enable), int32(i)) +} + +func (l *Logger) IsEnabled() bool { + return atomic.LoadInt32(&(l.enable)) != 0 +} + +func (l *Logger) Print(v ...interface{}) { + if l.IsEnabled() { + logger.DefaultLogger.Log(logger.InfoLevel, v...) + } +} + +func (l *Logger) Printf(format string, v ...interface{}) { + if l.IsEnabled() { + logger.DefaultLogger.Logf(logger.InfoLevel, format, v...) + } +} diff --git a/pkg/casbin/mycasbin.go b/pkg/casbin/mycasbin.go index 622a3e69..e65c6232 100644 --- a/pkg/casbin/mycasbin.go +++ b/pkg/casbin/mycasbin.go @@ -1,14 +1,11 @@ package mycasbin import ( - "log" - "github.com/casbin/casbin/v2" + "github.com/casbin/casbin/v2/log" "github.com/casbin/casbin/v2/model" gormAdapter "github.com/casbin/gorm-adapter/v3" - _ "github.com/go-sql-driver/mysql" - - "go-admin/common/global" + "gorm.io/gorm" ) // Initialize the model from a string. @@ -26,8 +23,8 @@ e = some(where (p.eft == allow)) m = r.sub == p.sub && (keyMatch2(r.obj, p.obj) || keyMatch(r.obj, p.obj)) && (r.act == p.act || p.act == "*") ` -func Setup() { - Apter, err := gormAdapter.NewAdapterByDBUsePrefix(global.Eloquent, "sys_") +func Setup(db *gorm.DB, prefix string) *casbin.SyncedEnforcer { + Apter, err := gormAdapter.NewAdapterByDBUsePrefix(db, prefix) if err != nil { panic(err) } @@ -43,18 +40,8 @@ func Setup() { if err != nil { panic(err) } - global.CasbinEnforcer = e -} -func Casbin() *casbin.SyncedEnforcer { - return global.CasbinEnforcer -} - -func LoadPolicy() (*casbin.SyncedEnforcer, error) { - if err := global.CasbinEnforcer.LoadPolicy(); err == nil { - return global.CasbinEnforcer, err - } else { - log.Printf("casbin rbac_model or policy init error, message: %v \r\n", err.Error()) - return nil, err - } + log.SetLogger(&Logger{}) + e.EnableLog(true) + return e } diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index 7c958b7a..b39a0126 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -2,16 +2,16 @@ package logger import ( "github.com/gogf/gf/os/glog" - "go-admin/common/global" + "go-admin/tools" "go-admin/tools/config" ) -var Logger *glog.Logger -var JobLogger *glog.Logger -var RequestLogger *glog.Logger +func Setup() (*glog.Logger, *glog.Logger, *glog.Logger) { + var Logger *glog.Logger + var JobLogger *glog.Logger + var RequestLogger *glog.Logger -func Setup() { Logger = glog.New() _ = Logger.SetPath(config.LoggerConfig.Path + "/bus") Logger.SetStdoutPrint(config.LoggerConfig.EnabledBUS && config.LoggerConfig.Stdout) @@ -31,8 +31,5 @@ func Setup() { _ = RequestLogger.SetLevelStr(config.LoggerConfig.Level) Logger.Info(tools.Green("Logger init success!")) - - global.Logger = Logger.Line() - global.JobLogger = JobLogger.Line() - global.RequestLogger = RequestLogger.Line() + return Logger, JobLogger, RequestLogger }