修改日志模块

This commit is contained in:
huangxiaolei
2022-12-13 16:52:06 +08:00
parent 9dc864ff69
commit 662b058327
19 changed files with 134 additions and 82 deletions

5
.gitignore vendored
View File

@@ -18,8 +18,11 @@
.idea .idea
*.iml *.iml
# Binaries file # Output binaries file dir
bin bin
# Game protocol protobuf generate file # Game protocol protobuf generate file
protocol/proto/*.pb.go protocol/proto/*.pb.go
# Log file
*.log

View File

@@ -6,8 +6,9 @@ kcp_port = 22103
[logger] [logger]
level = "DEBUG" level = "DEBUG"
method = "CONSOLE" mode = "BOTH"
track_line = true track = true
max_size = 10485760
[database] [database]
url = "mongodb://mongo:27017" url = "mongodb://mongo:27017"

View File

@@ -4,8 +4,9 @@ kcp_port = 22103
[logger] [logger]
level = "DEBUG" level = "DEBUG"
method = "CONSOLE" mode = "BOTH"
track_line = true track = true
max_size = 10485760
[mq] [mq]
nats_url = "nats://nats:4222" nats_url = "nats://nats:4222"

View File

@@ -2,8 +2,9 @@ http_port = 9001
[logger] [logger]
level = "DEBUG" level = "DEBUG"
method = "CONSOLE" mode = "BOTH"
track_line = true track = true
max_size = 10485760
[database] [database]
url = "mongodb://mongo:27017" url = "mongodb://mongo:27017"

View File

@@ -5,8 +5,9 @@ gacha_history_server = "https://hk4e.flswld.com/api/v1"
[logger] [logger]
level = "DEBUG" level = "DEBUG"
method = "CONSOLE" mode = "BOTH"
track_line = true track = true
max_size = 10485760
[database] [database]
url = "mongodb://mongo:27017" url = "mongodb://mongo:27017"

View File

@@ -3,37 +3,43 @@ package config
import ( import (
"fmt" "fmt"
"hk4e/pkg/logger"
"github.com/BurntSushi/toml" "github.com/BurntSushi/toml"
) )
var CONF *Config = nil var CONF *Config = nil
// 配置 // Config 配置
type Config struct { type Config struct {
HttpPort int `toml:"http_port"` HttpPort int32 `toml:"http_port"`
Logger logger.Config `toml:"logger"` Logger Logger `toml:"logger"`
Database Database `toml:"database"` Database Database `toml:"database"`
Hk4e Hk4e `toml:"hk4e"` Hk4e Hk4e `toml:"hk4e"`
MQ MQ `toml:"mq"` MQ MQ `toml:"mq"`
} }
// 数据库配置 // Logger 日志
type Logger struct {
Level string `toml:"level"`
Mode string `toml:"mode"`
Track bool `toml:"track"`
MaxSize int32 `toml:"max_size"`
}
// Database 数据库配置
type Database struct { type Database struct {
Url string `toml:"url"` Url string `toml:"url"`
} }
// 原神相关 // Hk4e 原神相关
type Hk4e struct { type Hk4e struct {
KcpPort int `toml:"kcp_port"` KcpPort int32 `toml:"kcp_port"`
KcpAddr string `toml:"kcp_addr"` KcpAddr string `toml:"kcp_addr"`
ResourcePath string `toml:"resource_path"` ResourcePath string `toml:"resource_path"`
GameDataConfigPath string `toml:"game_data_config_path"` GameDataConfigPath string `toml:"game_data_config_path"`
GachaHistoryServer string `toml:"gacha_history_server"` GachaHistoryServer string `toml:"gacha_history_server"`
} }
// 消息队列 // MQ 消息队列
type MQ struct { type MQ struct {
NatsUrl string `toml:"nats_url"` NatsUrl string `toml:"nats_url"`
} }

View File

@@ -33,7 +33,7 @@ func LoadRsaKey() (signRsaKey []byte, encRsaKeyMap map[string][]byte, pwdRsaKey
return signRsaKey, encRsaKeyMap, pwdRsaKey return signRsaKey, encRsaKeyMap, pwdRsaKey
} }
func InitRegion(kcpAddr string, kcpPort int) (*proto.QueryCurrRegionHttpRsp, *proto.QueryRegionListHttpRsp, *random.Ec2b) { func InitRegion(kcpAddr string, kcpPort int32) (*proto.QueryCurrRegionHttpRsp, *proto.QueryRegionListHttpRsp, *random.Ec2b) {
dispatchEc2b := random.NewEc2b() dispatchEc2b := random.NewEc2b()
dispatchEc2bData := dispatchEc2b.Bytes() dispatchEc2bData := dispatchEc2b.Bytes()
dispatchXorKey := dispatchEc2b.XorKey() dispatchXorKey := dispatchEc2b.XorKey()

View File

@@ -17,7 +17,7 @@ import (
func Run(ctx context.Context, configFile string) error { func Run(ctx context.Context, configFile string) error {
config.InitConfig(configFile) config.InitConfig(configFile)
logger.InitLogger("dispatch", config.CONF.Logger) logger.InitLogger("dispatch")
logger.LOG.Info("dispatch start") logger.LOG.Info("dispatch start")
db := dao.NewDao() db := dao.NewDao()

View File

@@ -162,7 +162,7 @@ func (c *Controller) registerRouter() {
engine.Use(c.authorize()) engine.Use(c.authorize())
engine.POST("/gate/token/verify", c.gateTokenVerify) engine.POST("/gate/token/verify", c.gateTokenVerify)
port := config.CONF.HttpPort port := config.CONF.HttpPort
addr := ":" + strconv.Itoa(port) addr := ":" + strconv.Itoa(int(port))
err := engine.Run(addr) err := engine.Run(addr)
if err != nil { if err != nil {
logger.LOG.Error("gin run error: %v", err) logger.LOG.Error("gin run error: %v", err)

View File

@@ -19,7 +19,7 @@ import (
func Run(ctx context.Context, configFile string) error { func Run(ctx context.Context, configFile string) error {
config.InitConfig(configFile) config.InitConfig(configFile)
logger.InitLogger("gate", config.CONF.Logger) logger.InitLogger("gate")
logger.LOG.Info("gate start") logger.LOG.Info("gate start")
kcpEventInput := make(chan *net.KcpEvent) kcpEventInput := make(chan *net.KcpEvent)

View File

@@ -61,8 +61,8 @@ func (k *KcpConnectManager) Start() {
// key // key
k.dispatchKey = make([]byte, 4096) k.dispatchKey = make([]byte, 4096)
// kcp // kcp
port := strconv.FormatInt(int64(config.CONF.Hk4e.KcpPort), 10) port := strconv.Itoa(int(config.CONF.Hk4e.KcpPort))
listener, err := kcp.ListenWithOptions("0.0.0.0:"+port, nil, 0, 0) listener, err := kcp.ListenWithOptions(config.CONF.Hk4e.KcpAddr+":"+port, nil, 0, 0)
if err != nil { if err != nil {
logger.LOG.Error("listen kcp err: %v", err) logger.LOG.Error("listen kcp err: %v", err)
return return

View File

@@ -40,7 +40,7 @@ func CheckJsonLoop(path string, errorJsonFileList *[]string, totalJsonFileCount
func TestCheckJsonValid(t *testing.T) { func TestCheckJsonValid(t *testing.T) {
config.InitConfig("./application.toml") config.InitConfig("./application.toml")
logger.InitLogger("test", config.CONF.Logger) logger.InitLogger("test")
errorJsonFileList := make([]string, 0) errorJsonFileList := make([]string, 0)
totalJsonFileCount := 0 totalJsonFileCount := 0
CheckJsonLoop("./game_data_config/json", &errorJsonFileList, &totalJsonFileCount) CheckJsonLoop("./game_data_config/json", &errorJsonFileList, &totalJsonFileCount)

View File

@@ -9,7 +9,7 @@ import (
func TestInitGameDataConfig(t *testing.T) { func TestInitGameDataConfig(t *testing.T) {
config.InitConfig("./application.toml") config.InitConfig("./application.toml")
logger.InitLogger("test", config.CONF.Logger) logger.InitLogger("test")
logger.LOG.Info("start load conf") logger.LOG.Info("start load conf")
InitGameDataConfig() InitGameDataConfig()
logger.LOG.Info("load conf finish, conf: %v", CONF) logger.LOG.Info("load conf finish, conf: %v", CONF)

View File

@@ -18,7 +18,7 @@ import (
func Run(ctx context.Context, configFile string) error { func Run(ctx context.Context, configFile string) error {
config.InitConfig(configFile) config.InitConfig(configFile)
logger.InitLogger("gm", config.CONF.Logger) logger.InitLogger("gm")
logger.LOG.Info("gm start") logger.LOG.Info("gm start")
conn, err := nats.Connect(config.CONF.MQ.NatsUrl) conn, err := nats.Connect(config.CONF.MQ.NatsUrl)

View File

@@ -48,7 +48,7 @@ func (c *Controller) registerRouter() {
engine.Use(c.authorize()) engine.Use(c.authorize())
engine.POST("/gm/cmd", c.gmCmd) engine.POST("/gm/cmd", c.gmCmd)
port := config.CONF.HttpPort port := config.CONF.HttpPort
addr := ":" + strconv.Itoa(port) addr := ":" + strconv.Itoa(int(port))
err := engine.Run(addr) err := engine.Run(addr)
if err != nil { if err != nil {
logger.LOG.Error("gin run error: %v", err) logger.LOG.Error("gin run error: %v", err)

View File

@@ -25,7 +25,7 @@ import (
func Run(ctx context.Context, configFile string) error { func Run(ctx context.Context, configFile string) error {
config.InitConfig(configFile) config.InitConfig(configFile)
logger.InitLogger("gs", config.CONF.Logger) logger.InitLogger("gs")
logger.LOG.Info("gs start") logger.LOG.Info("gs start")
constant.InitConstant() constant.InitConstant()

View File

@@ -10,7 +10,7 @@ import (
func TestAoiManagerGetSurrGridListByGid(t *testing.T) { func TestAoiManagerGetSurrGridListByGid(t *testing.T) {
filePath := "./application.toml" filePath := "./application.toml"
config.InitConfig(filePath) config.InitConfig(filePath)
logger.InitLogger("", config.CONF.Logger) logger.InitLogger("")
aoiManager := NewAoiManager( aoiManager := NewAoiManager(
-150, 150, 3, -150, 150, 3,
-150, 150, 3, -150, 150, 3,

View File

@@ -73,7 +73,7 @@ func (g *GameManager) Stop() {
LOCAL_EVENT_MANAGER.localEventChan <- &LocalEvent{ LOCAL_EVENT_MANAGER.localEventChan <- &LocalEvent{
EventId: RunUserCopyAndSave, EventId: RunUserCopyAndSave,
} }
time.Sleep(time.Second * 5) time.Sleep(time.Second * 3)
//g.worldManager.worldStatic.SaveTerrain() //g.worldManager.worldStatic.SaveTerrain()
} }

View File

@@ -3,6 +3,7 @@ package logger
import ( import (
"bytes" "bytes"
"fmt" "fmt"
"hk4e/common/config"
"log" "log"
"os" "os"
"path" "path"
@@ -13,31 +14,39 @@ import (
) )
const ( const (
DEBUG int = 1 DEBUG = iota
INFO int = 2 INFO
ERROR int = 3 ERROR
UNKNOWN int = 4 UNKNOWN
) )
const ( const (
CONSOLE int = 1 CONSOLE = iota
FILE int = 2 FILE
BOTH int = 3 BOTH
NEITHER int = 4 NEITHER
) )
type Config struct { var (
Level string `toml:"level"` GREEN = string([]byte{27, 91, 51, 50, 109})
Method string `toml:"method"` WHITE = string([]byte{27, 91, 51, 55, 109})
TrackLine bool `toml:"track_line"` YELLOW = string([]byte{27, 91, 51, 51, 109})
} RED = string([]byte{27, 91, 51, 49, 109})
BLUE = string([]byte{27, 91, 51, 52, 109})
MAGENTA = string([]byte{27, 91, 51, 53, 109})
CYAN = string([]byte{27, 91, 51, 54, 109})
RESET = string([]byte{27, 91, 48, 109})
ALL_COLOR = []string{GREEN, WHITE, YELLOW, RED, BLUE, MAGENTA, CYAN, RESET}
)
var LOG *Logger = nil var LOG *Logger = nil
type Logger struct { type Logger struct {
AppName string
Level int Level int
Method int Mode int
TrackLine bool Track bool
MaxSize int32
File *os.File File *os.File
LogInfoChan chan *LogInfo LogInfoChan chan *LogInfo
} }
@@ -53,33 +62,19 @@ type LogInfo struct {
Stack string Stack string
} }
func InitLogger(name string, cfg Config) { func InitLogger(appName string) {
log.SetFlags(0) log.SetFlags(0)
LOG = new(Logger) LOG = new(Logger)
LOG.Level = getLevelInt(cfg.Level) LOG.AppName = appName
LOG.Method = getMethodInt(cfg.Method) LOG.Level = getLevelInt(config.CONF.Logger.Level)
LOG.TrackLine = cfg.TrackLine LOG.Mode = getModeInt(config.CONF.Logger.Mode)
LOG.Track = config.CONF.Logger.Track
LOG.MaxSize = config.CONF.Logger.MaxSize
LOG.LogInfoChan = make(chan *LogInfo, 1000) LOG.LogInfoChan = make(chan *LogInfo, 1000)
if LOG.Method == FILE || LOG.Method == BOTH { LOG.File = nil
file, err := os.OpenFile("./"+name+".log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
info := fmt.Sprintf("open log file error: %v\n", err)
panic(info)
}
LOG.File = file
}
go LOG.doLog() go LOG.doLog()
} }
var GREEN = string([]byte{27, 91, 51, 50, 109})
var WHITE = string([]byte{27, 91, 51, 55, 109})
var YELLOW = string([]byte{27, 91, 51, 51, 109})
var RED = string([]byte{27, 91, 51, 49, 109})
var BLUE = string([]byte{27, 91, 51, 52, 109})
var MAGENTA = string([]byte{27, 91, 51, 53, 109})
var CYAN = string([]byte{27, 91, 51, 54, 109})
var RESET = string([]byte{27, 91, 48, 109})
func (l *Logger) doLog() { func (l *Logger) doLog() {
for { for {
logInfo := <-l.LogInfoChan logInfo := <-l.LogInfoChan
@@ -93,7 +88,7 @@ func (l *Logger) doLog() {
} else if logInfo.Level == ERROR { } else if logInfo.Level == ERROR {
logHeader += RED + "[" + l.getLevelStr(logInfo.Level) + "]" + RESET + " " logHeader += RED + "[" + l.getLevelStr(logInfo.Level) + "]" + RESET + " "
} }
if l.TrackLine { if l.Track {
logHeader += MAGENTA + "[" + logHeader += MAGENTA + "[" +
logInfo.FileName + ":" + strconv.Itoa(logInfo.Line) + " " + logInfo.FileName + ":" + strconv.Itoa(logInfo.Line) + " " +
logInfo.FuncName + "()" + " " + logInfo.FuncName + "()" + " " +
@@ -109,17 +104,61 @@ func (l *Logger) doLog() {
if logInfo.Stack != "" { if logInfo.Stack != "" {
logStr += logInfo.Stack logStr += logInfo.Stack
} }
if l.Method == CONSOLE { if l.Mode == CONSOLE {
log.Print(logStr) log.Print(logStr)
} else if l.Method == FILE { } else if l.Mode == FILE {
_, _ = l.File.WriteString(logStr) l.WriteLogFile(logStr)
} else if l.Method == BOTH { } else if l.Mode == BOTH {
log.Print(logStr) log.Print(logStr)
_, _ = l.File.WriteString(logStr) l.WriteLogFile(logStr)
} }
} }
} }
func (l *Logger) WriteLogFile(logStr string) {
for _, v := range ALL_COLOR {
logStr = strings.ReplaceAll(logStr, v, "")
}
if l.File == nil {
file, err := os.OpenFile("./"+l.AppName+".log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
fmt.Printf(RED+"open new log file error: %v\n"+RESET, err)
return
}
LOG.File = file
}
fileStat, err := l.File.Stat()
if err != nil {
fmt.Printf(RED+"get log file stat error: %v\n"+RESET, err)
return
}
if fileStat.Size() >= int64(l.MaxSize) {
err = l.File.Close()
if err != nil {
fmt.Printf(RED+"close old log file error: %v\n"+RESET, err)
return
}
timeNow := time.Now()
timeNowStr := timeNow.Format("2006-01-02-15_04_05")
err = os.Rename(l.File.Name(), l.File.Name()+"."+timeNowStr+".log")
if err != nil {
fmt.Printf(RED+"rename old log file error: %v\n"+RESET, err)
return
}
file, err := os.OpenFile("./"+l.AppName+".log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
fmt.Printf(RED+"open new log file error: %v\n"+RESET, err)
return
}
LOG.File = file
}
_, err = l.File.WriteString(logStr)
if err != nil {
fmt.Printf(RED+"write log file error: %v\n"+RESET, err)
return
}
}
func (l *Logger) Debug(msg string, param ...any) { func (l *Logger) Debug(msg string, param ...any) {
if l.Level > DEBUG { if l.Level > DEBUG {
return return
@@ -128,7 +167,7 @@ func (l *Logger) Debug(msg string, param ...any) {
logInfo.Level = DEBUG logInfo.Level = DEBUG
logInfo.Msg = msg logInfo.Msg = msg
logInfo.Param = param logInfo.Param = param
if l.TrackLine { if l.Track {
logInfo.FileName, logInfo.Line, logInfo.FuncName = l.getLineFunc() logInfo.FileName, logInfo.Line, logInfo.FuncName = l.getLineFunc()
logInfo.GoroutineId = l.getGoroutineId() logInfo.GoroutineId = l.getGoroutineId()
} }
@@ -143,7 +182,7 @@ func (l *Logger) Info(msg string, param ...any) {
logInfo.Level = INFO logInfo.Level = INFO
logInfo.Msg = msg logInfo.Msg = msg
logInfo.Param = param logInfo.Param = param
if l.TrackLine { if l.Track {
logInfo.FileName, logInfo.Line, logInfo.FuncName = l.getLineFunc() logInfo.FileName, logInfo.Line, logInfo.FuncName = l.getLineFunc()
logInfo.GoroutineId = l.getGoroutineId() logInfo.GoroutineId = l.getGoroutineId()
} }
@@ -158,7 +197,7 @@ func (l *Logger) Error(msg string, param ...any) {
logInfo.Level = ERROR logInfo.Level = ERROR
logInfo.Msg = msg logInfo.Msg = msg
logInfo.Param = param logInfo.Param = param
if l.TrackLine { if l.Track {
logInfo.FileName, logInfo.Line, logInfo.FuncName = l.getLineFunc() logInfo.FileName, logInfo.Line, logInfo.FuncName = l.getLineFunc()
logInfo.GoroutineId = l.getGoroutineId() logInfo.GoroutineId = l.getGoroutineId()
} }
@@ -173,7 +212,7 @@ func (l *Logger) ErrorStack(msg string, param ...any) {
logInfo.Level = ERROR logInfo.Level = ERROR
logInfo.Msg = msg logInfo.Msg = msg
logInfo.Param = param logInfo.Param = param
if l.TrackLine { if l.Track {
logInfo.FileName, logInfo.Line, logInfo.FuncName = l.getLineFunc() logInfo.FileName, logInfo.Line, logInfo.FuncName = l.getLineFunc()
logInfo.GoroutineId = l.getGoroutineId() logInfo.GoroutineId = l.getGoroutineId()
logInfo.Stack = l.Stack() logInfo.Stack = l.Stack()
@@ -207,8 +246,8 @@ func (l *Logger) getLevelStr(level int) (ret string) {
return ret return ret
} }
func getMethodInt(method string) (ret int) { func getModeInt(mode string) (ret int) {
switch method { switch mode {
case "CONSOLE": case "CONSOLE":
ret = CONSOLE ret = CONSOLE
case "FILE": case "FILE":