forked from free-lancers/electricity_bill_calc_service
		
	feat(log):完全使用Zerolog接管项目中的日志记录。
This commit is contained in:
		| @@ -6,6 +6,7 @@ import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"electricity_bill_calc/config" | ||||
| 	"electricity_bill_calc/logger" | ||||
|  | ||||
| 	// _ "github.com/lib/pq" | ||||
| 	_ "github.com/jackc/pgx/v5/stdlib" | ||||
| @@ -40,6 +41,8 @@ func SetupDatabaseConnection() error { | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	xLogger := logger.NewXormZeroLogger(logger.GetLogger()) | ||||
| 	DBConn.SetLogger(log.NewLoggerAdapter(xLogger)) | ||||
|  | ||||
| 	DBConn.Ping() | ||||
| 	DBConn.SetMaxIdleConns(config.DatabaseSettings.MaxIdleConns) | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import ( | ||||
| 	"io" | ||||
| 	"os" | ||||
|  | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| 	"github.com/rs/zerolog" | ||||
| 	"github.com/samber/lo" | ||||
| ) | ||||
| @@ -20,6 +21,10 @@ func init() { | ||||
| 	logger.Info().Msg("Logger initialized.") | ||||
| } | ||||
|  | ||||
| func GetLogger() *zerolog.Logger { | ||||
| 	return logger | ||||
| } | ||||
|  | ||||
| func Panic() *zerolog.Event { | ||||
| 	return logger.Panic() | ||||
| } | ||||
| @@ -59,3 +64,12 @@ func Printf(format string, v ...interface{}) { | ||||
| func With() zerolog.Context { | ||||
| 	return logger.With() | ||||
| } | ||||
|  | ||||
| func FormatAny(v interface{}) string { | ||||
| 	b, err := jsoniter.MarshalToString(v) | ||||
| 	if err != nil { | ||||
| 		logger.Error().Str("process", "log").Err(err).Stack().Msg("Value marshal failed.") | ||||
| 		return "" | ||||
| 	} | ||||
| 	return b | ||||
| } | ||||
|   | ||||
							
								
								
									
										97
									
								
								logger/xormlogger.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								logger/xormlogger.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,97 @@ | ||||
| package logger | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/rs/zerolog" | ||||
| 	"github.com/samber/lo" | ||||
| 	"xorm.io/xorm/log" | ||||
| ) | ||||
|  | ||||
| type XormZeroLogger struct { | ||||
| 	logger *zerolog.Logger | ||||
| 	off    bool | ||||
| 	show   bool | ||||
| } | ||||
|  | ||||
| func NewXormZeroLogger(oLogger *zerolog.Logger) *XormZeroLogger { | ||||
| 	return &XormZeroLogger{ | ||||
| 		logger: lo.ToPtr(oLogger.With().Str("process", "Xorm").Logger()), | ||||
| 		off:    false, | ||||
| 		show:   true, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) BeforeSQL(_ log.LogContext) {} | ||||
|  | ||||
| func (l XormZeroLogger) AfterSQL(c log.LogContext) { | ||||
| 	if c.Err == nil { | ||||
| 		l.logger.Info().Str("SQL", c.SQL).Str("args", FormatAny(c.Args)).Dur("execution", c.ExecuteTime).Send() | ||||
| 		return | ||||
| 	} | ||||
| 	l.logger.Error().Err(c.Err).Stack().Str("SQL", c.SQL).Str("args", FormatAny(c.Args)).Dur("execution", c.ExecuteTime).Msg(c.Err.Error()) | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) Debug(v ...interface{}) { | ||||
| 	l.logger.Debug().Str("args", FormatAny(v)).Msg(fmt.Sprint(v...)) | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) Debugf(format string, v ...interface{}) { | ||||
| 	l.logger.Debug().Str("args", FormatAny(v)).Msg(fmt.Sprintf(format, v...)) | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) Info(v ...interface{}) { | ||||
| 	l.logger.Info().Str("args", FormatAny(v)).Msg(fmt.Sprint(v...)) | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) Infof(format string, v ...interface{}) { | ||||
| 	l.logger.Info().Str("args", FormatAny(v)).Msg(fmt.Sprintf(format, v...)) | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) Warn(v ...interface{}) { | ||||
| 	l.logger.Warn().Str("args", FormatAny(v)).Msg(fmt.Sprint(v...)) | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) Warnf(format string, v ...interface{}) { | ||||
| 	l.logger.Warn().Str("args", FormatAny(v)).Msg(fmt.Sprintf(format, v...)) | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) Error(v ...interface{}) { | ||||
| 	l.logger.Error().Str("args", FormatAny(v)).Msg(fmt.Sprint(v...)) | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) Errorf(format string, v ...interface{}) { | ||||
| 	l.logger.Error().Str("args", FormatAny(v)).Msg(fmt.Sprintf(format, v...)) | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) SetLevel(lvl log.LogLevel) { | ||||
| 	l.logger.Warn().Msg("Change log level is not supported.") | ||||
| } | ||||
|  | ||||
| func (l *XormZeroLogger) ShowSQL(b ...bool) { | ||||
| 	l.show = b[0] | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) IsShowSQL() bool { | ||||
| 	return l.show | ||||
| } | ||||
|  | ||||
| func (l XormZeroLogger) Level() log.LogLevel { | ||||
| 	if l.off { | ||||
| 		return log.LOG_OFF | ||||
| 	} | ||||
|  | ||||
| 	for _, lvl := range []zerolog.Level{zerolog.DebugLevel, zerolog.InfoLevel, zerolog.WarnLevel, zerolog.ErrorLevel, zerolog.FatalLevel, zerolog.PanicLevel} { | ||||
| 		switch lvl { | ||||
| 		case zerolog.DebugLevel: | ||||
| 			return log.LOG_DEBUG | ||||
| 		case zerolog.InfoLevel: | ||||
| 			return log.LOG_INFO | ||||
| 		case zerolog.WarnLevel: | ||||
| 			return log.LOG_WARNING | ||||
| 		case zerolog.ErrorLevel: | ||||
| 			return log.LOG_ERR | ||||
| 		} | ||||
| 	} | ||||
| 	return log.LOG_UNKNOWN | ||||
| } | ||||
							
								
								
									
										34
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								main.go
									
									
									
									
									
								
							| @@ -4,13 +4,13 @@ import ( | ||||
| 	"electricity_bill_calc/cache" | ||||
| 	"electricity_bill_calc/config" | ||||
| 	"electricity_bill_calc/global" | ||||
| 	"electricity_bill_calc/logger" | ||||
| 	"electricity_bill_calc/model" | ||||
| 	"electricity_bill_calc/router" | ||||
| 	"electricity_bill_calc/service" | ||||
| 	"encoding/csv" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 	"time" | ||||
| @@ -24,15 +24,15 @@ import ( | ||||
| func init() { | ||||
| 	err := config.SetupSetting() | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Configuration load failed: %v", err) | ||||
| 		logger.Fatal().Err(err).Stack().Msg("Configuration load failed.") | ||||
| 	} | ||||
| 	log.Println("Configuration loaded!") | ||||
| 	logger.Info().Msg("Configuration loaded!") | ||||
|  | ||||
| 	err = global.SetupDatabaseConnection() | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Main Database connect failed: %v", err) | ||||
| 		logger.Fatal().Err(err).Stack().Msg("Main Database connect failed.") | ||||
| 	} | ||||
| 	log.Println("Main Database connected!") | ||||
| 	logger.Info().Msg("Main Database connected!") | ||||
|  | ||||
| 	err = global.DBConn.Sync( | ||||
| 		&model.Region{}, | ||||
| @@ -47,27 +47,27 @@ func init() { | ||||
| 		&model.WillDilutedFee{}, | ||||
| 		&model.EndUserDetail{}) | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Database structure synchronize failed: %v", err) | ||||
| 		logger.Fatal().Err(err).Stack().Msg("Database structure synchronize failed.") | ||||
| 	} | ||||
| 	log.Println("Database structure synchronized.") | ||||
| 	logger.Info().Msg("Database structure synchronized.") | ||||
|  | ||||
| 	err = global.SetupRedisConnection() | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Main Cache Database connect failed: %v", err) | ||||
| 		logger.Fatal().Err(err).Stack().Msg("Main Cache Database connect failed.") | ||||
| 	} | ||||
| 	log.Println("Main Cache Database connected!") | ||||
| 	logger.Info().Msg("Main Cache Database connected!") | ||||
|  | ||||
| 	err = initializeRegions() | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Regions initialize failed: %v", err) | ||||
| 		logger.Fatal().Err(err).Stack().Msg("Regions initialize failed.") | ||||
| 	} | ||||
| 	log.Println("Regions synchronized.") | ||||
| 	logger.Info().Msg("Regions synchronized.") | ||||
|  | ||||
| 	err = intializeSingularity() | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Singularity account intialize failed: %v", err) | ||||
| 		logger.Fatal().Err(err).Stack().Msg("Singularity account intialize failed.") | ||||
| 	} | ||||
| 	log.Println("Singularity account intialized.") | ||||
| 	logger.Info().Msg("Singularity account intialized.") | ||||
|  | ||||
| 	timeZoneShanghai, _ := time.LoadLocation("Asia/Shanghai") | ||||
| 	jsontime.AddTimeFormatAlias("simple_datetime", "2006-01-02 15:04:05") | ||||
| @@ -76,7 +76,7 @@ func init() { | ||||
| } | ||||
|  | ||||
| func initializeRegions() error { | ||||
| 	log.Println("Synchronize regions...") | ||||
| 	logger.Info().Msg("Synchronize regions...") | ||||
| 	regionCsvFile, err := os.Open("regions.csv") | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("region initialize file is not found: %w", err) | ||||
| @@ -145,7 +145,7 @@ func intializeSingularity() error { | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("singularity account failed to create: %w", err) | ||||
| 	} | ||||
| 	log.Printf("Singularity account created, use %s as verify code to reset password.", verifyCode) | ||||
| 	logger.Info().Str("account", "singularity").Str("verifyCode", verifyCode).Msg(fmt.Sprintf("Singularity account created, use %s as verify code to reset password.", verifyCode)) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -160,10 +160,10 @@ func DBConnectionKeepLive() { | ||||
|  | ||||
| func RedisOrphanCleanup() { | ||||
| 	for range time.Tick(2 * time.Minute) { | ||||
| 		log.Printf("[Cache] [Cleanup] Proceeding cleanup orphan keys.") | ||||
| 		logger.Info().Str("process", "Cache").Str("function", "Cleanup").Msg("Proceeding cleanup orphan keys.") | ||||
| 		err := cache.ClearOrphanRelationItems() | ||||
| 		if err != nil { | ||||
| 			log.Printf("[Cache] [Cleanup] Orphan keys clear failed: %v", err) | ||||
| 			logger.Error().Err(err).Stack().Str("process", "Cache").Str("function", "Cleanup").Msg("Orphan keys clear failed.") | ||||
| 			continue | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
| @@ -2,16 +2,16 @@ package router | ||||
|  | ||||
| import ( | ||||
| 	"electricity_bill_calc/controller" | ||||
| 	"electricity_bill_calc/logger" | ||||
| 	"electricity_bill_calc/response" | ||||
| 	"electricity_bill_calc/security" | ||||
| 	"log" | ||||
| 	"runtime/debug" | ||||
|  | ||||
| 	"github.com/gin-gonic/gin" | ||||
| ) | ||||
|  | ||||
| func Router() *gin.Engine { | ||||
| 	router := gin.Default() | ||||
| 	router.Use(logger.Logger()) | ||||
| 	router.Use(Recover) | ||||
| 	router.Use(security.SessionRecovery) | ||||
|  | ||||
| @@ -40,8 +40,9 @@ func Recover(c *gin.Context) { | ||||
| 	defer func() { | ||||
| 		if r := recover(); r != nil { | ||||
| 			//打印错误堆栈信息 | ||||
| 			log.Printf("panic: %v\n", r) | ||||
| 			debug.PrintStack() | ||||
| 			if err, ok := r.(error); ok { | ||||
| 				logger.Error().Err(err).Stack().Msg(err.Error()) | ||||
| 			} | ||||
| 			// response.NewResult(c).Error(500, "服务器内部错误") | ||||
| 		} | ||||
| 	}() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user