feat(log):完全使用Zerolog接管项目中的日志记录。

This commit is contained in:
徐涛 2022-09-08 14:33:54 +08:00
parent 4f11249b94
commit d38b6ab064
5 changed files with 136 additions and 21 deletions

View File

@ -6,6 +6,7 @@ import (
"time" "time"
"electricity_bill_calc/config" "electricity_bill_calc/config"
"electricity_bill_calc/logger"
// _ "github.com/lib/pq" // _ "github.com/lib/pq"
_ "github.com/jackc/pgx/v5/stdlib" _ "github.com/jackc/pgx/v5/stdlib"
@ -40,6 +41,8 @@ func SetupDatabaseConnection() error {
if err != nil { if err != nil {
return err return err
} }
xLogger := logger.NewXormZeroLogger(logger.GetLogger())
DBConn.SetLogger(log.NewLoggerAdapter(xLogger))
DBConn.Ping() DBConn.Ping()
DBConn.SetMaxIdleConns(config.DatabaseSettings.MaxIdleConns) DBConn.SetMaxIdleConns(config.DatabaseSettings.MaxIdleConns)

View File

@ -4,6 +4,7 @@ import (
"io" "io"
"os" "os"
jsoniter "github.com/json-iterator/go"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"github.com/samber/lo" "github.com/samber/lo"
) )
@ -20,6 +21,10 @@ func init() {
logger.Info().Msg("Logger initialized.") logger.Info().Msg("Logger initialized.")
} }
func GetLogger() *zerolog.Logger {
return logger
}
func Panic() *zerolog.Event { func Panic() *zerolog.Event {
return logger.Panic() return logger.Panic()
} }
@ -59,3 +64,12 @@ func Printf(format string, v ...interface{}) {
func With() zerolog.Context { func With() zerolog.Context {
return logger.With() 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
View 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
View File

@ -4,13 +4,13 @@ import (
"electricity_bill_calc/cache" "electricity_bill_calc/cache"
"electricity_bill_calc/config" "electricity_bill_calc/config"
"electricity_bill_calc/global" "electricity_bill_calc/global"
"electricity_bill_calc/logger"
"electricity_bill_calc/model" "electricity_bill_calc/model"
"electricity_bill_calc/router" "electricity_bill_calc/router"
"electricity_bill_calc/service" "electricity_bill_calc/service"
"encoding/csv" "encoding/csv"
"fmt" "fmt"
"io" "io"
"log"
"os" "os"
"strconv" "strconv"
"time" "time"
@ -24,15 +24,15 @@ import (
func init() { func init() {
err := config.SetupSetting() err := config.SetupSetting()
if err != nil { 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() err = global.SetupDatabaseConnection()
if err != nil { 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( err = global.DBConn.Sync(
&model.Region{}, &model.Region{},
@ -47,27 +47,27 @@ func init() {
&model.WillDilutedFee{}, &model.WillDilutedFee{},
&model.EndUserDetail{}) &model.EndUserDetail{})
if err != nil { 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() err = global.SetupRedisConnection()
if err != nil { 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() err = initializeRegions()
if err != nil { 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() err = intializeSingularity()
if err != nil { 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") timeZoneShanghai, _ := time.LoadLocation("Asia/Shanghai")
jsontime.AddTimeFormatAlias("simple_datetime", "2006-01-02 15:04:05") jsontime.AddTimeFormatAlias("simple_datetime", "2006-01-02 15:04:05")
@ -76,7 +76,7 @@ func init() {
} }
func initializeRegions() error { func initializeRegions() error {
log.Println("Synchronize regions...") logger.Info().Msg("Synchronize regions...")
regionCsvFile, err := os.Open("regions.csv") regionCsvFile, err := os.Open("regions.csv")
if err != nil { if err != nil {
return fmt.Errorf("region initialize file is not found: %w", err) return fmt.Errorf("region initialize file is not found: %w", err)
@ -145,7 +145,7 @@ func intializeSingularity() error {
if err != nil { if err != nil {
return fmt.Errorf("singularity account failed to create: %w", err) 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 return nil
} }
@ -160,10 +160,10 @@ func DBConnectionKeepLive() {
func RedisOrphanCleanup() { func RedisOrphanCleanup() {
for range time.Tick(2 * time.Minute) { 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() err := cache.ClearOrphanRelationItems()
if err != nil { 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 continue
} }
} }

View File

@ -2,16 +2,16 @@ package router
import ( import (
"electricity_bill_calc/controller" "electricity_bill_calc/controller"
"electricity_bill_calc/logger"
"electricity_bill_calc/response" "electricity_bill_calc/response"
"electricity_bill_calc/security" "electricity_bill_calc/security"
"log"
"runtime/debug"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
func Router() *gin.Engine { func Router() *gin.Engine {
router := gin.Default() router := gin.Default()
router.Use(logger.Logger())
router.Use(Recover) router.Use(Recover)
router.Use(security.SessionRecovery) router.Use(security.SessionRecovery)
@ -40,8 +40,9 @@ func Recover(c *gin.Context) {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
//打印错误堆栈信息 //打印错误堆栈信息
log.Printf("panic: %v\n", r) if err, ok := r.(error); ok {
debug.PrintStack() logger.Error().Err(err).Stack().Msg(err.Error())
}
// response.NewResult(c).Error(500, "服务器内部错误") // response.NewResult(c).Error(500, "服务器内部错误")
} }
}() }()