feat(log):完全使用Zerolog接管项目中的日志记录。
This commit is contained in:
parent
4f11249b94
commit
d38b6ab064
|
@ -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)
|
||||||
|
|
|
@ -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
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/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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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, "服务器内部错误")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user