feat(logging): order log fields for improved readability

This commit is contained in:
hkfires
2026-01-15 10:44:54 +08:00
parent 847be0e99d
commit 1fbbba6f59
3 changed files with 21 additions and 19 deletions

View File

@@ -6,7 +6,6 @@ import (
"io" "io"
"os" "os"
"path/filepath" "path/filepath"
"sort"
"strings" "strings"
"sync" "sync"
@@ -30,6 +29,9 @@ var (
// Format: [2025-12-23 20:14:04] [debug] [manager.go:524] | a1b2c3d4 | Use API key sk-9...0RHO for model gpt-5.2 // Format: [2025-12-23 20:14:04] [debug] [manager.go:524] | a1b2c3d4 | Use API key sk-9...0RHO for model gpt-5.2
type LogFormatter struct{} type LogFormatter struct{}
// logFieldOrder defines the display order for common log fields.
var logFieldOrder = []string{"provider", "model", "mode", "budget", "level", "original_value", "min", "max", "clamped_to", "error"}
// Format renders a single log entry with custom formatting. // Format renders a single log entry with custom formatting.
func (m *LogFormatter) Format(entry *log.Entry) ([]byte, error) { func (m *LogFormatter) Format(entry *log.Entry) ([]byte, error) {
var buffer *bytes.Buffer var buffer *bytes.Buffer
@@ -56,17 +58,19 @@ func (m *LogFormatter) Format(entry *log.Entry) ([]byte, error) {
// Build fields string (excluding request_id which is already shown) // Build fields string (excluding request_id which is already shown)
var fieldsStr string var fieldsStr string
if len(entry.Data) > 0 { if len(entry.Data) > 0 {
var keys []string seen := make(map[string]bool)
for k := range entry.Data { var fields []string
if k == "request_id" { for _, k := range logFieldOrder {
if v, ok := entry.Data[k]; ok {
fields = append(fields, fmt.Sprintf("%s=%v", k, v))
seen[k] = true
}
}
for k, v := range entry.Data {
if k == "request_id" || seen[k] {
continue continue
} }
keys = append(keys, k) fields = append(fields, fmt.Sprintf("%s=%v", k, v))
}
sort.Strings(keys)
var fields []string
for _, k := range keys {
fields = append(fields, fmt.Sprintf("%s=%v", k, entry.Data[k]))
} }
if len(fields) > 0 { if len(fields) > 0 {
fieldsStr = " " + strings.Join(fields, " ") fieldsStr = " " + strings.Join(fields, " ")

View File

@@ -149,7 +149,7 @@ func ApplyThinking(body []byte, model string, provider string) ([]byte, error) {
"provider": provider, "provider": provider,
"model": modelInfo.ID, "model": modelInfo.ID,
"error": err.Error(), "error": err.Error(),
}).Warn("thinking: validation failed, returning original body") }).Warn("thinking: validation failed")
// Return original body on validation failure (defensive programming). // Return original body on validation failure (defensive programming).
// This ensures callers who ignore the error won't receive nil body. // This ensures callers who ignore the error won't receive nil body.
// The upstream service will decide how to handle the unmodified request. // The upstream service will decide how to handle the unmodified request.

View File

@@ -76,12 +76,10 @@ func ClampBudgetWithZeroCheck(value, min, max int, zeroAllowed bool) int {
return 0 return 0
} }
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"original_value": value,
"clamped_to": min, "clamped_to": min,
"min": min, "min": min,
"max": max, "max": max,
"reason": "zero_not_allowed", }).Warn("thinking: budget zero not allowed")
}).Warn("budget clamped: zero not allowed")
return min return min
} }
@@ -253,8 +251,8 @@ func convertAutoToMidRange(config ThinkingConfig, support *registry.ThinkingSupp
func logClamp(original, clampedTo, min, max int) { func logClamp(original, clampedTo, min, max int) {
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"original_value": original, "original_value": original,
"clamped_to": clampedTo,
"min": min, "min": min,
"max": max, "max": max,
}).Debug("budget clamped: value outside model range") "clamped_to": clampedTo,
}).Debug("thinking: budget clamped")
} }