From 6abbd036f8c1dcf27c076e3e7e2a55b50213eaac Mon Sep 17 00:00:00 2001 From: CaIon Date: Sat, 2 Aug 2025 11:07:50 +0800 Subject: [PATCH] feat: add recordErrorLog option to NewAPIError for conditional error logging --- controller/relay.go | 2 +- relay/relay-text.go | 6 +++--- types/error.go | 30 ++++++++++++++++++++++++------ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/controller/relay.go b/controller/relay.go index b5b8f8fe..1a35c7d7 100644 --- a/controller/relay.go +++ b/controller/relay.go @@ -47,7 +47,7 @@ func relayHandler(c *gin.Context, relayMode int) *types.NewAPIError { err = relay.TextHelper(c) } - if constant2.ErrorLogEnabled && err != nil { + if constant2.ErrorLogEnabled && err != nil && types.IsRecordErrorLog(err) { // 保存错误日志到mysql中 userId := c.GetInt("id") tokenName := c.GetString("token_name") diff --git a/relay/relay-text.go b/relay/relay-text.go index 97313be6..f175dbfb 100644 --- a/relay/relay-text.go +++ b/relay/relay-text.go @@ -305,10 +305,10 @@ func preConsumeQuota(c *gin.Context, preConsumedQuota int, relayInfo *relaycommo return 0, 0, types.NewError(err, types.ErrorCodeQueryDataError, types.ErrOptionWithSkipRetry()) } if userQuota <= 0 { - return 0, 0, types.NewErrorWithStatusCode(errors.New("user quota is not enough"), types.ErrorCodeInsufficientUserQuota, http.StatusForbidden, types.ErrOptionWithSkipRetry()) + return 0, 0, types.NewErrorWithStatusCode(errors.New("user quota is not enough"), types.ErrorCodeInsufficientUserQuota, http.StatusForbidden, types.ErrOptionWithSkipRetry(), types.ErrOptionWithNoRecordErrorLog()) } if userQuota-preConsumedQuota < 0 { - return 0, 0, types.NewErrorWithStatusCode(fmt.Errorf("pre-consume quota failed, user quota: %s, need quota: %s", common.FormatQuota(userQuota), common.FormatQuota(preConsumedQuota)), types.ErrorCodeInsufficientUserQuota, http.StatusForbidden, types.ErrOptionWithSkipRetry()) + return 0, 0, types.NewErrorWithStatusCode(fmt.Errorf("pre-consume quota failed, user quota: %s, need quota: %s", common.FormatQuota(userQuota), common.FormatQuota(preConsumedQuota)), types.ErrorCodeInsufficientUserQuota, http.StatusForbidden, types.ErrOptionWithSkipRetry(), types.ErrOptionWithNoRecordErrorLog()) } relayInfo.UserQuota = userQuota if userQuota > 100*preConsumedQuota { @@ -332,7 +332,7 @@ func preConsumeQuota(c *gin.Context, preConsumedQuota int, relayInfo *relaycommo if preConsumedQuota > 0 { err := service.PreConsumeTokenQuota(relayInfo, preConsumedQuota) if err != nil { - return 0, 0, types.NewErrorWithStatusCode(err, types.ErrorCodePreConsumeTokenQuotaFailed, http.StatusForbidden, types.ErrOptionWithSkipRetry()) + return 0, 0, types.NewErrorWithStatusCode(err, types.ErrorCodePreConsumeTokenQuotaFailed, http.StatusForbidden, types.ErrOptionWithSkipRetry(), types.ErrOptionWithNoRecordErrorLog()) } err = model.DecreaseUserQuota(relayInfo.UserId, preConsumedQuota) if err != nil { diff --git a/types/error.go b/types/error.go index 86aaf692..e7265e21 100644 --- a/types/error.go +++ b/types/error.go @@ -76,12 +76,13 @@ const ( ) type NewAPIError struct { - Err error - RelayError any - skipRetry bool - errorType ErrorType - errorCode ErrorCode - StatusCode int + Err error + RelayError any + skipRetry bool + recordErrorLog *bool + errorType ErrorType + errorCode ErrorCode + StatusCode int } func (e *NewAPIError) GetErrorCode() ErrorCode { @@ -278,3 +279,20 @@ func ErrOptionWithSkipRetry() NewAPIErrorOptions { e.skipRetry = true } } + +func ErrOptionWithNoRecordErrorLog() NewAPIErrorOptions { + return func(e *NewAPIError) { + e.recordErrorLog = common.GetPointer(false) + } +} + +func IsRecordErrorLog(e *NewAPIError) bool { + if e == nil { + return false + } + if e.recordErrorLog == nil { + // default to true if not set + return true + } + return *e.recordErrorLog +}