package logx import ( "context" "encoding/json" "fmt" "github.com/sirupsen/logrus" "os" ) type ( Logger = logrus.Logger Entry = logrus.Entry Hook = logrus.Hook Level = logrus.Level ) func Init(ctx context.Context) { SetLevel(logrus.DebugLevel) SetFormatter(func() logrus.Formatter { return &TextFormatter{} }()) WithContext(ctx).Infof("application process in PID: %v", os.Getpid()) } func SetLevel(level Level) { logrus.SetLevel(level) } func SetFormatter(format logrus.Formatter) { logrus.SetFormatter(format) } // //func SetFormatter(format string) { // switch format { // case "json": // logrus.SetFormatter(&logrus.JSONFormatter{}) // case "text": // logrus.SetFormatter(&TextFormatter{}) // default: // logrus.SetFormatter(&logrus.TextFormatter{}) // } //} func AddHook(hook Hook) { logrus.AddHook(hook) } const ( TraceIdKey = "trace" UserIDKey = "uid" GuuIDKey = "guid" SchoolIDKey = "school" UsernameKey = "username" TagKey = "tag" StackKey = "stack" ) type ( traceIdKey struct{} userIDKey struct{} guuIDKey struct{} usernameKey struct{} schoolIdKey struct{} tagKey struct{} stackKey struct{} requestKey struct{} responseKey struct{} diff1Key struct{} diff2Key struct{} actionKey struct{} ) func TraceIdContext(ctx context.Context, traceId string) context.Context { return context.WithValue(ctx, traceIdKey{}, traceId) } func FromTraceIdContext(ctx context.Context) string { if v := ctx.Value(traceIdKey{}); v != nil { if s, ok := v.(string); ok { return s } } return "" } func UserIDContext(ctx context.Context, userId int) context.Context { return context.WithValue(ctx, userIDKey{}, userId) } func FromUserIDContext(ctx context.Context) int { if v := ctx.Value(userIDKey{}); v != nil { if s, ok := v.(int); ok { return s } } return 0 } func GuuIDContext(ctx context.Context, userId string) context.Context { return context.WithValue(ctx, guuIDKey{}, userId) } func FromGuuIDContext(ctx context.Context) string { if v := ctx.Value(guuIDKey{}); v != nil { if s, ok := v.(string); ok { return s } } return "" } func SchoolIDContext(ctx context.Context, userId int) context.Context { return context.WithValue(ctx, schoolIdKey{}, userId) } func FromSchoolIDContext(ctx context.Context) int { if v := ctx.Value(schoolIdKey{}); v != nil { if s, ok := v.(int); ok { return s } } return 0 } func UsernameContext(ctx context.Context, username string) context.Context { return context.WithValue(ctx, usernameKey{}, username) } func FromUsernameContext(ctx context.Context) string { if v := ctx.Value(usernameKey{}); v != nil { if s, ok := v.(string); ok { return s } } return "" } func TagContext(ctx context.Context, tag string) context.Context { return context.WithValue(ctx, tagKey{}, tag) } func FromTagContext(ctx context.Context) string { if v := ctx.Value(tagKey{}); v != nil { if s, ok := v.(string); ok { return s } } return "" } func ActionContext(ctx context.Context, action string) context.Context { return context.WithValue(ctx, actionKey{}, action) } func FromActionContext(ctx context.Context) string { if v := ctx.Value(actionKey{}); v != nil { if s, ok := v.(string); ok { return s } } return "" } func StackContext(ctx context.Context, stack error) context.Context { return context.WithValue(ctx, stackKey{}, stack) } func FromStackContext(ctx context.Context) error { if v := ctx.Value(tagKey{}); v != nil { if e, ok := v.(error); ok { return e } } return nil } func RequestContext(ctx context.Context, data []byte) context.Context { return context.WithValue(ctx, requestKey{}, string(data)) } func FromRequestContext(ctx context.Context) string { if v := ctx.Value(requestKey{}); v != "" { if e, ok := v.(string); ok { return e } } return "" } func ResponseContext(ctx context.Context, data any) context.Context { bts, _ := json.Marshal(&data) return context.WithValue(ctx, responseKey{}, string(bts)) } func FromResponseContext(ctx context.Context) string { if v := ctx.Value(responseKey{}); v != "" { if e, ok := v.(string); ok { return e } } return "" } func DiffContext(ctx context.Context, data1, data2 any) context.Context { ctx = context.WithValue(ctx, diff1Key{}, data1) ctx = context.WithValue(ctx, diff2Key{}, data2) return ctx } func FromDiffContext(ctx context.Context) (any, any) { return ctx.Value(diff1Key{}), ctx.Value(diff2Key{}) } func WithContext(ctx context.Context) *Entry { fields := logrus.Fields{} if v := FromTraceIdContext(ctx); v != "" { fields[TraceIdKey] = v } if v := FromUserIDContext(ctx); v != 0 { fields[UserIDKey] = v } if v := FromGuuIDContext(ctx); v != "" { fields[GuuIDKey] = v } if v := FromSchoolIDContext(ctx); v != 0 { fields[SchoolIDKey] = v } if v := FromUsernameContext(ctx); v != "" { fields[UsernameKey] = v } if v := FromTagContext(ctx); v != "" { fields[TagKey] = v } if v := FromStackContext(ctx); v != nil { fields[StackKey] = fmt.Sprintf("%+v", v) } return logrus.WithContext(ctx).WithFields(fields) } var ( Tracef = logrus.Tracef Debugf = logrus.Debugf Infof = logrus.Infof Warnf = logrus.Warnf Errorf = logrus.Errorf Fatalf = logrus.Fatalf Panicf = logrus.Panicf Printf = logrus.Printf SetOutput = logrus.SetOutput SetReportCaller = logrus.SetReportCaller StandardLogger = logrus.StandardLogger ParseLevel = logrus.ParseLevel )