From d0cad61028071edef78c5b8889c1450b3deaa3ca Mon Sep 17 00:00:00 2001 From: yaodeshun Date: Thu, 21 Aug 2025 16:09:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E4=BA=9Berr=E6=8E=A5=E5=8F=97?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package/gamelog/sdk.go | 44 +++++++++++++++++++++------- package/gamelog/test/gamelog_test.go | 3 +- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/package/gamelog/sdk.go b/package/gamelog/sdk.go index 0f0443a..91fa42b 100644 --- a/package/gamelog/sdk.go +++ b/package/gamelog/sdk.go @@ -39,6 +39,7 @@ type SDKConfig struct { FlushInterval int // 刷新间隔 DiskBakPath string // 磁盘备份路径 RetryN int // 每N次重试 + ChanSize int // 信道大小, 默认1000 reportN int } @@ -100,6 +101,12 @@ func (sdk *SDK) varinit() error { } sdk.sdkConfig.RetryN = _retryN.Int() + _chanSize, err := g.Config().Get(ctx, "angergs.bisdk.chanSize") + if err != nil { + return err + } + sdk.sdkConfig.ChanSize = _chanSize.Int() + g.Log().Infof(ctx, "[GameLog]client init success, config: %v", sdk.sdkConfig) return nil } @@ -124,6 +131,9 @@ func (sdk *SDK) checkConfig() error { if config.RetryN == 0 { config.RetryN = 10 } + if config.ChanSize == 0 { + config.ChanSize = 1000 + } config.DiskBakPath = strings.TrimSuffix(config.DiskBakPath, "/") return nil @@ -148,7 +158,9 @@ func INIT(config *SDKConfig) (*SDK, error) { sdk.buffer = make([]GameLog, 0, 100) // 加载失败日志 failLogs, err := sdk.loadFailLogs4disk() - if err != nil && len(failLogs) > 0 { + if err != nil { + g.Log().Errorf(ctx, "[GameLog]load fail logs error: %v", err) + } else if len(failLogs) > 0 { sdk.buffer = append(sdk.buffer, failLogs...) } @@ -212,7 +224,11 @@ func (sdk *SDK) loadFailLogs4disk() (logs []GameLog, err error) { // 备份失败日志追加到磁盘 func (sdk *SDK) bakFailLogs2disk(failLogs []GameLog) { bakPath := fmt.Sprintf("%s/failBuffer%s.bak.log", sdk.sdkConfig.DiskBakPath, gtime.Now().Format("YmdH")) - content, _ := json.Marshal(failLogs) + content, err := json.Marshal(failLogs) + if err != nil { + g.Log().Errorf(ctx, "[GameLog]marshal fail logs error: %v", err) + return + } gfile.PutContentsAppend(bakPath, string(content)+"\n") g.Log().Infof(ctx, "[GameLog]backup fail buffer to %s", bakPath) } @@ -288,7 +304,11 @@ func (sdk *SDK) send(logs []GameLog) { data := make([][]any, 0, len(logs)) // logs 拆分成二维数组 for _, log := range logs { - propertyJson, _ := json.Marshal(log.Property) + propertyJson, err := json.Marshal(log.Property) + if err != nil { + g.Log().Errorf(ctx, "[GameLog]skip log parse, marshal property error: %v", err) + continue + } data = append(data, []any{ log.Uid, log.Event, @@ -302,7 +322,11 @@ func (sdk *SDK) send(logs []GameLog) { Pid: sdk.sdkConfig.Pid, Data: data, } - jsonBody, _ := json.Marshal(sbody) + jsonBody, err := json.Marshal(sbody) + if err != nil { + g.Log().Errorf(ctx, "[GameLog]marshal send body error: %v", err) + return + } // giz压缩 gzBody := bytes.NewBuffer([]byte{}) @@ -315,18 +339,18 @@ func (sdk *SDK) send(logs []GameLog) { sdk.sdkConfig.reportN += 1 res, err := gamelogClient.Post(timeoutCtx, sdk.sdkConfig.BaseUrl+"/report/event", xorBody) - defer func() { - cerr := res.Close() - if cerr != nil { - g.Log().Errorf(ctx, "[GameLog]close response error: %v", cerr) - } - }() // 失败重新加入缓冲区 if err != nil { sdk.bakFailLogs2disk(logs) g.Log().Warningf(ctx, "[GameLog]send log error, bak to fail buffer(%d): %v", len(logs), err) return } + defer func() { + cerr := res.Close() + if cerr != nil { + g.Log().Errorf(ctx, "[GameLog]close response error: %v", cerr) + } + }() httpcode := res.StatusCode resBody := res.ReadAllString() // 收集器拦截, 重新加入缓冲区 diff --git a/package/gamelog/test/gamelog_test.go b/package/gamelog/test/gamelog_test.go index 252b919..e1cbc89 100644 --- a/package/gamelog/test/gamelog_test.go +++ b/package/gamelog/test/gamelog_test.go @@ -21,7 +21,8 @@ func TestGamelog(t *testing.T) { FlushInterval: 5, // 上报间隔 DiskBakPath: "gamelog", // 本地磁盘备份, 用于意外情况下临时保存日志, 请确保该目录持久化(容器内要挂载). 每次启动时或每N次上报时加载到失败队列 // 可填 - RetryN: 2, // 默认每10次上传检查一次磁盘的失败数据 + RetryN: 2, // 默认每10次, 上传检查一次磁盘的失败数据 + ChanSize: 500, // 默认1000, 信道size }) // 随机测试事件和属性