@@ -114,11 +114,11 @@ func (ps *ProxyServer) executeRequestWithRetry(
114114 }
115115 logrus .Debugf ("Max retries exceeded for group %s after %d attempts. Parsed Error: %s" , group .Name , retryCount , logMessage )
116116
117- ps .logRequest (c , group , & models.APIKey {KeyValue : lastError .KeyValue }, startTime , lastError .StatusCode , retryCount , errors .New (logMessage ), isStream , lastError .UpstreamAddr , channelHandler , bodyBytes )
117+ ps .logRequest (c , group , & models.APIKey {KeyValue : lastError .KeyValue }, startTime , lastError .StatusCode , retryCount , errors .New (logMessage ), isStream , lastError .UpstreamAddr , channelHandler , bodyBytes , "" )
118118 } else {
119119 response .Error (c , app_errors .ErrMaxRetriesExceeded )
120120 logrus .Debugf ("Max retries exceeded for group %s after %d attempts." , group .Name , retryCount )
121- ps .logRequest (c , group , nil , startTime , http .StatusServiceUnavailable , retryCount , app_errors .ErrMaxRetriesExceeded , isStream , "" , channelHandler , bodyBytes )
121+ ps .logRequest (c , group , nil , startTime , http .StatusServiceUnavailable , retryCount , app_errors .ErrMaxRetriesExceeded , isStream , "" , channelHandler , bodyBytes , "" )
122122 }
123123 return
124124 }
@@ -127,7 +127,7 @@ func (ps *ProxyServer) executeRequestWithRetry(
127127 if err != nil {
128128 logrus .Errorf ("Failed to select a key for group %s on attempt %d: %v" , group .Name , retryCount + 1 , err )
129129 response .Error (c , app_errors .NewAPIError (app_errors .ErrNoKeysAvailable , err .Error ()))
130- ps .logRequest (c , group , nil , startTime , http .StatusServiceUnavailable , retryCount , err , isStream , "" , channelHandler , bodyBytes )
130+ ps .logRequest (c , group , nil , startTime , http .StatusServiceUnavailable , retryCount , err , isStream , "" , channelHandler , bodyBytes , "" )
131131 return
132132 }
133133
@@ -191,7 +191,7 @@ func (ps *ProxyServer) executeRequestWithRetry(
191191 if err != nil || (resp != nil && resp .StatusCode >= 400 && resp .StatusCode != http .StatusNotFound ) {
192192 if err != nil && app_errors .IsIgnorableError (err ) {
193193 logrus .Debugf ("Client-side ignorable error for key %s, aborting retries: %v" , utils .MaskAPIKey (apiKey .KeyValue ), err )
194- ps .logRequest (c , group , apiKey , startTime , 499 , retryCount + 1 , err , isStream , upstreamURL , channelHandler , bodyBytes )
194+ ps .logRequest (c , group , apiKey , startTime , 499 , retryCount + 1 , err , isStream , upstreamURL , channelHandler , bodyBytes , "" )
195195 return
196196 }
197197
@@ -236,7 +236,6 @@ func (ps *ProxyServer) executeRequestWithRetry(
236236
237237 // ps.keyProvider.UpdateStatus(apiKey, group, true) // 请求成功不再重置成功次数,减少IO消耗
238238 logrus .Debugf ("Request for group %s succeeded on attempt %d with key %s" , group .Name , retryCount + 1 , utils .MaskAPIKey (apiKey .KeyValue ))
239- ps .logRequest (c , group , apiKey , startTime , resp .StatusCode , retryCount + 1 , nil , isStream , upstreamURL , channelHandler , bodyBytes )
240239
241240 for key , values := range resp .Header {
242241 for _ , value := range values {
@@ -245,11 +244,14 @@ func (ps *ProxyServer) executeRequestWithRetry(
245244 }
246245 c .Status (resp .StatusCode )
247246
247+ var responseBody string
248248 if isStream {
249- ps .handleStreamingResponse (c , resp )
249+ responseBody = ps .handleStreamingResponse (c , resp )
250250 } else {
251- ps .handleNormalResponse (c , resp )
251+ responseBody = ps .handleNormalResponse (c , resp )
252252 }
253+
254+ ps .logRequest (c , group , apiKey , startTime , resp .StatusCode , retryCount + 1 , nil , isStream , upstreamURL , channelHandler , bodyBytes , responseBody )
253255}
254256
255257// logRequest is a helper function to create and record a request log.
@@ -265,25 +267,56 @@ func (ps *ProxyServer) logRequest(
265267 upstreamAddr string ,
266268 channelHandler channel.ChannelProxy ,
267269 bodyBytes []byte ,
270+ responseBody string ,
268271) {
269272 if ps .requestLogService == nil {
270273 return
271274 }
272275
273276 duration := time .Since (startTime ).Milliseconds ()
274277
278+ // 日志记录逻辑:系统开启 AND 分组开启 = 记录
279+ var requestBodyToLog , responseBodyToLog string
280+ var bodyLogStatus string
281+
282+ systemEnabled := ps .settingsManager .GetSettings ().EnableRequestBodyLogging
283+ groupEnabled := true // 默认分组开启
284+
285+ // 检查分组配置中的设置
286+ if group .Config != nil {
287+ if enableValue , exists := group .Config ["enable_request_body_logging" ]; exists {
288+ if enable , ok := enableValue .(bool ); ok {
289+ groupEnabled = enable
290+ }
291+ }
292+ }
293+
294+ // 只有系统和分组都开启才记录
295+ if ! systemEnabled {
296+ bodyLogStatus = "system_disabled"
297+ } else if ! groupEnabled {
298+ bodyLogStatus = "group_disabled"
299+ } else {
300+ bodyLogStatus = "enabled"
301+ requestBodyToLog = string (bodyBytes )
302+ responseBodyToLog = responseBody
303+ }
304+
275305 logEntry := & models.RequestLog {
276- GroupID : group .ID ,
277- GroupName : group .Name ,
278- IsSuccess : finalError == nil && statusCode < 400 ,
279- SourceIP : c .ClientIP (),
280- StatusCode : statusCode ,
281- RequestPath : utils .TruncateString (c .Request .URL .String (), 500 ),
282- Duration : duration ,
283- UserAgent : c .Request .UserAgent (),
284- Retries : retries ,
285- IsStream : isStream ,
286- UpstreamAddr : utils .TruncateString (upstreamAddr , 500 ),
306+ GroupID : group .ID ,
307+ GroupName : group .Name ,
308+ IsSuccess : finalError == nil && statusCode < 400 ,
309+ SourceIP : c .ClientIP (),
310+ StatusCode : statusCode ,
311+ RequestPath : utils .TruncateString (c .Request .URL .String (), 500 ),
312+ Duration : duration ,
313+ UserAgent : c .Request .UserAgent (),
314+ Retries : retries ,
315+ IsStream : isStream ,
316+ UpstreamAddr : utils .TruncateString (upstreamAddr , 500 ),
317+ RequestBody : requestBodyToLog ,
318+ ResponseBody : responseBodyToLog ,
319+ BodyLogStatus : bodyLogStatus ,
287320 }
288321
289322 if channelHandler != nil && bodyBytes != nil {
0 commit comments