Sort log keys by both priority and name; Add priority for "source" key

This commit is contained in:
DarthSim
2025-08-16 21:30:00 +03:00
parent 7bdae0fb0a
commit 46ba23a775

View File

@@ -4,7 +4,7 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"regexp" "regexp"
"sort" "slices"
"strings" "strings"
"time" "time"
"unicode/utf8" "unicode/utf8"
@@ -12,23 +12,35 @@ import (
logrus "github.com/sirupsen/logrus" logrus "github.com/sirupsen/logrus"
) )
var ( var logQuotingRe = regexp.MustCompile(`^[a-zA-Z0-9\-._/@^+]+$`)
logKeysPriorities = map[string]int{
"request_id": 3, func logKeyPriority(k string) int {
"method": 2, switch k {
"status": 1, case "request_id":
"error": -1, return 3
"stack": -2, case "method":
return 2
case "status":
return 1
case "error":
return -1
case "source":
return -2
case "stack":
return -3
default:
return 0
} }
}
logQuotingRe = regexp.MustCompile(`^[a-zA-Z0-9\-._/@^+]+$`) func sortKeys(keys []string) {
) slices.SortFunc(keys, func(key1, key2 string) int {
if d := logKeyPriority(key2) - logKeyPriority(key1); d != 0 {
type logKeys []string return d
}
func (p logKeys) Len() int { return len(p) } return strings.Compare(key1, key2)
func (p logKeys) Less(i, j int) bool { return logKeysPriorities[p[i]] > logKeysPriorities[p[j]] } })
func (p logKeys) Swap(i, j int) { p[i], p[j] = p[j], p[i] } }
type prettyFormatter struct { type prettyFormatter struct {
levelFormat string levelFormat string
@@ -51,14 +63,19 @@ func newPrettyFormatter() *prettyFormatter {
} }
func (f *prettyFormatter) Format(entry *logrus.Entry) ([]byte, error) { func (f *prettyFormatter) Format(entry *logrus.Entry) ([]byte, error) {
keys := make([]string, 0, len(entry.Data)) var keys []string
for k := range entry.Data {
if k != "stack" {
keys = append(keys, k)
}
}
sort.Sort(logKeys(keys)) if len(entry.Data) > 0 {
keys = make([]string, 0, len(entry.Data))
for k := range entry.Data {
if k != "stack" {
keys = append(keys, k)
}
}
sortKeys(keys)
}
levelColor := 36 levelColor := 36
switch entry.Level { switch entry.Level {
@@ -113,12 +130,17 @@ func (f *prettyFormatter) appendValue(b *bytes.Buffer, value interface{}) {
type structuredFormatter struct{} type structuredFormatter struct{}
func (f *structuredFormatter) Format(entry *logrus.Entry) ([]byte, error) { func (f *structuredFormatter) Format(entry *logrus.Entry) ([]byte, error) {
keys := make([]string, 0, len(entry.Data)) var keys []string
for k := range entry.Data {
keys = append(keys, k)
}
sort.Sort(logKeys(keys)) if len(entry.Data) > 0 {
keys = make([]string, 0, len(entry.Data))
for k := range entry.Data {
keys = append(keys, k)
}
sortKeys(keys)
}
msg := strings.TrimSuffix(entry.Message, "\n") msg := strings.TrimSuffix(entry.Message, "\n")