diff --git a/contrib/registry/etcd/etcd.go b/contrib/registry/etcd/etcd.go index 690149c01..c0d7128ea 100644 --- a/contrib/registry/etcd/etcd.go +++ b/contrib/registry/etcd/etcd.go @@ -31,12 +31,12 @@ type Registry struct { kv etcd3.KV lease etcd3.Lease keepaliveTTL time.Duration - logger *glog.Logger + logger glog.ILogger } // Option is the option for the etcd registry. type Option struct { - Logger *glog.Logger + Logger glog.ILogger KeepaliveTTL time.Duration } diff --git a/net/ghttp/ghttp_server.go b/net/ghttp/ghttp_server.go index 6c3f97e21..09d7efbc7 100644 --- a/net/ghttp/ghttp_server.go +++ b/net/ghttp/ghttp_server.go @@ -177,16 +177,16 @@ func (s *Server) Start() error { } // Default session storage. if s.config.SessionStorage == nil { - path := "" + sessionStoragePath := "" if s.config.SessionPath != "" { - path = gfile.Join(s.config.SessionPath, s.config.Name) - if !gfile.Exists(path) { - if err := gfile.Mkdir(path); err != nil { - return gerror.Wrapf(err, `mkdir failed for "%s"`, path) + sessionStoragePath = gfile.Join(s.config.SessionPath, s.config.Name) + if !gfile.Exists(sessionStoragePath) { + if err := gfile.Mkdir(sessionStoragePath); err != nil { + return gerror.Wrapf(err, `mkdir failed for "%s"`, sessionStoragePath) } } } - s.config.SessionStorage = gsession.NewStorageFile(path, s.config.SessionMaxAge) + s.config.SessionStorage = gsession.NewStorageFile(sessionStoragePath, s.config.SessionMaxAge) } // Initialize session manager when start running. s.sessionManager = gsession.New( diff --git a/net/gtrace/gtrace.go b/net/gtrace/gtrace.go index 81299dcf8..171da62fb 100644 --- a/net/gtrace/gtrace.go +++ b/net/gtrace/gtrace.go @@ -150,13 +150,16 @@ func GetBaggageVar(ctx context.Context, key string) *gvar.Var { func WithTraceID(ctx context.Context, traceID string) (context.Context, error) { generatedTraceID, err := trace.TraceIDFromHex(traceID) if err != nil { - return nil, gerror.WrapCodef(gcode.CodeInvalidParameter, err, `invalid traceID: %s`, traceID) + return ctx, gerror.WrapCodef( + gcode.CodeInvalidParameter, + err, + `invalid custom traceID "%s", a traceID string should be composed with [0-9a-z] and fixed length 32`, + traceID, + ) } sc := trace.SpanContextFromContext(ctx) if !sc.HasTraceID() { - var ( - span trace.Span - ) + var span trace.Span ctx, span = NewSpan(ctx, "gtrace.WithTraceID") defer span.End() sc = trace.SpanContextFromContext(ctx) diff --git a/net/gtrace/gtrace_z_unit_test.go b/net/gtrace/gtrace_z_unit_test.go new file mode 100644 index 000000000..76f86d706 --- /dev/null +++ b/net/gtrace/gtrace_z_unit_test.go @@ -0,0 +1,36 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gtrace_test + +import ( + "context" + "testing" + + "github.com/gogf/gf/v2/net/gtrace" + "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/text/gstr" +) + +func TestWithTraceID(t *testing.T) { + var ( + ctx = context.Background() + requestId = `a323f910-f690-11ec-963d-79c0b7fcf119` + ) + gtest.C(t, func(t *gtest.T) { + newCtx, err := gtrace.WithTraceID(ctx, requestId) + t.AssertNE(err, nil) + t.Assert(newCtx, ctx) + }) + gtest.C(t, func(t *gtest.T) { + var traceId = gstr.Replace(requestId, "-", "") + newCtx, err := gtrace.WithTraceID(ctx, traceId) + t.AssertNil(err) + t.AssertNE(newCtx, ctx) + t.Assert(gtrace.GetTraceID(ctx), "") + t.Assert(gtrace.GetTraceID(newCtx), traceId) + }) +} diff --git a/os/gcron/gcron.go b/os/gcron/gcron.go index d1a7ad74e..05e834d3b 100644 --- a/os/gcron/gcron.go +++ b/os/gcron/gcron.go @@ -28,12 +28,12 @@ var ( ) // SetLogger sets the logger for cron. -func SetLogger(logger *glog.Logger) { +func SetLogger(logger glog.ILogger) { defaultCron.SetLogger(logger) } // GetLogger returns the logger in the cron. -func GetLogger() *glog.Logger { +func GetLogger() glog.ILogger { return defaultCron.GetLogger() } diff --git a/os/gcron/gcron_cron.go b/os/gcron/gcron_cron.go index fddb6bfa2..1a83f57bc 100644 --- a/os/gcron/gcron_cron.go +++ b/os/gcron/gcron_cron.go @@ -21,7 +21,7 @@ type Cron struct { idGen *gtype.Int64 // Used for unique name generation. status *gtype.Int // Timed task status(0: Not Start; 1: Running; 2: Stopped; -1: Closed) entries *gmap.StrAnyMap // All timed task entries. - logger *glog.Logger // Logger, it is nil in default. + logger glog.ILogger // Logger, it is nil in default. } // New returns a new Cron object with default settings. @@ -34,12 +34,12 @@ func New() *Cron { } // SetLogger sets the logger for cron. -func (c *Cron) SetLogger(logger *glog.Logger) { +func (c *Cron) SetLogger(logger glog.ILogger) { c.logger = logger } // GetLogger returns the logger in the cron. -func (c *Cron) GetLogger() *glog.Logger { +func (c *Cron) GetLogger() glog.ILogger { return c.logger } diff --git a/os/gcron/gcron_entry.go b/os/gcron/gcron_entry.go index f0ce842e2..a5f5209e2 100644 --- a/os/gcron/gcron_entry.go +++ b/os/gcron/gcron_entry.go @@ -8,6 +8,7 @@ package gcron import ( "context" + "fmt" "reflect" "runtime" "time" @@ -19,6 +20,7 @@ import ( "github.com/gogf/gf/v2/util/gconv" ) +// JobFunc is the timing called job function in cron. type JobFunc = gtimer.JobFunc // Entry is timing task entry. @@ -140,7 +142,7 @@ func (entry *Entry) checkAndRun(ctx context.Context) { return case StatusClosed: - entry.logDebugf(ctx, "[gcron] %s %s removed", entry.schedule.pattern, entry.jobName) + entry.logDebugf(ctx, `cron job "%s" is removed`, entry.getJobNameWithPattern()) entry.Close() case StatusReady: @@ -149,11 +151,11 @@ func (entry *Entry) checkAndRun(ctx context.Context) { defer func() { if exception := recover(); exception != nil { entry.logErrorf(ctx, - "[gcron] %s %s end with error: %+v", - entry.schedule.pattern, entry.jobName, exception, + `cron job "%s(%s)" end with error: %+v`, + entry.jobName, entry.schedule.pattern, exception, ) } else { - entry.logDebugf(ctx, "[gcron] %s %s end", entry.schedule.pattern, entry.jobName) + entry.logDebugf(ctx, `cron job "%s" ends`, entry.getJobNameWithPattern()) } if entry.timerEntry.Status() == StatusClosed { @@ -170,13 +172,17 @@ func (entry *Entry) checkAndRun(ctx context.Context) { } } } - entry.logDebugf(ctx, "[gcron] %s %s start", entry.schedule.pattern, entry.jobName) + entry.logDebugf(ctx, `cron job "%s" starts`, entry.getJobNameWithPattern()) entry.Job(ctx) } } } +func (entry *Entry) getJobNameWithPattern() string { + return fmt.Sprintf(`%s(%s)`, entry.jobName, entry.schedule.pattern) +} + func (entry *Entry) logDebugf(ctx context.Context, format string, v ...interface{}) { if logger := entry.cron.GetLogger(); logger != nil { logger.Debugf(ctx, format, v...) diff --git a/os/glog/glog.go b/os/glog/glog.go index 15c9a6576..32b3e5072 100644 --- a/os/glog/glog.go +++ b/os/glog/glog.go @@ -8,16 +8,43 @@ package glog import ( + "context" + "github.com/gogf/gf/v2/internal/command" "github.com/gogf/gf/v2/os/grpool" "github.com/gogf/gf/v2/util/gconv" ) +// ILogger is the API interface for logger. +type ILogger interface { + Print(ctx context.Context, v ...interface{}) + Printf(ctx context.Context, format string, v ...interface{}) + Debug(ctx context.Context, v ...interface{}) + Debugf(ctx context.Context, format string, v ...interface{}) + Info(ctx context.Context, v ...interface{}) + Infof(ctx context.Context, format string, v ...interface{}) + Notice(ctx context.Context, v ...interface{}) + Noticef(ctx context.Context, format string, v ...interface{}) + Warning(ctx context.Context, v ...interface{}) + Warningf(ctx context.Context, format string, v ...interface{}) + Error(ctx context.Context, v ...interface{}) + Errorf(ctx context.Context, format string, v ...interface{}) + Critical(ctx context.Context, v ...interface{}) + Criticalf(ctx context.Context, format string, v ...interface{}) + Panic(ctx context.Context, v ...interface{}) + Panicf(ctx context.Context, format string, v ...interface{}) + Fatal(ctx context.Context, v ...interface{}) + Fatalf(ctx context.Context, format string, v ...interface{}) +} + const ( commandEnvKeyForDebug = "gf.glog.debug" ) var ( + // Ensure Logger implements ILogger. + _ ILogger = &Logger{} + // Default logger object, for package method usage. defaultLogger = New() diff --git a/os/glog/glog_logger_handler.go b/os/glog/glog_logger_handler.go index 2b69ec593..2c610e999 100644 --- a/os/glog/glog_logger_handler.go +++ b/os/glog/glog_logger_handler.go @@ -94,15 +94,15 @@ func (in *HandlerInput) getDefaultBuffer(withColor bool) *bytes.Buffer { in.addStringToBuffer(buffer, levelStr) } } - if in.Prefix != "" { - in.addStringToBuffer(buffer, in.Prefix) - } if in.TraceId != "" { in.addStringToBuffer(buffer, "{"+in.TraceId+"}") } if in.CtxStr != "" { in.addStringToBuffer(buffer, "{"+in.CtxStr+"}") } + if in.Prefix != "" { + in.addStringToBuffer(buffer, in.Prefix) + } if in.CallerFunc != "" { in.addStringToBuffer(buffer, in.CallerFunc) } diff --git a/os/gtimer/gtimer_entry.go b/os/gtimer/gtimer_entry.go index c057e9951..dc389d08d 100644 --- a/os/gtimer/gtimer_entry.go +++ b/os/gtimer/gtimer_entry.go @@ -26,7 +26,7 @@ type Entry struct { infinite *gtype.Bool // No times limit. } -// JobFunc is the job function. +// JobFunc is the timing called job function in timer. type JobFunc = func(ctx context.Context) // Status returns the status of the job.