This commit is contained in:
lpf
2026-03-03 10:36:53 +08:00
parent 35b0ad1bfd
commit bd93c12edc
30 changed files with 1311 additions and 262 deletions

179
pkg/logger/codes.go Normal file
View File

@@ -0,0 +1,179 @@
package logger
type CodeID int
const (
C0001 CodeID = iota + 1
C0002
C0003
C0004
C0005
C0006
C0007
C0008
C0009
C0010
C0011
C0012
C0013
C0014
C0015
C0016
C0017
C0018
C0019
C0020
C0021
C0022
C0023
C0024
C0025
C0026
C0027
C0028
C0029
C0030
C0031
C0032
C0033
C0034
C0035
C0036
C0037
C0038
C0039
C0040
C0041
C0042
C0043
C0044
C0045
C0046
C0047
C0048
C0049
C0050
C0051
C0052
C0053
C0054
C0055
C0056
C0057
C0058
C0059
C0060
C0061
C0062
C0063
C0064
C0065
C0066
C0067
C0068
C0069
C0070
C0071
C0072
C0073
C0074
C0075
C0076
C0077
C0078
C0079
C0080
C0081
C0082
C0083
C0084
C0085
C0086
C0087
C0088
C0089
C0090
C0091
C0092
C0093
C0094
C0095
C0096
C0097
C0098
C0099
C0100
C0101
C0102
C0103
C0104
C0105
C0106
C0107
C0108
C0109
C0110
C0111
C0112
C0113
C0114
C0115
C0116
C0117
C0118
C0119
C0120
C0121
C0122
C0123
C0124
C0125
C0126
C0127
C0128
C0129
C0130
C0131
C0132
C0133
C0134
C0135
C0136
C0137
C0138
C0139
C0140
C0141
C0142
C0143
C0144
C0145
C0146
C0147
C0148
C0149
C0150
C0151
C0152
C0153
C0154
C0155
C0156
C0157
C0158
C0159
C0160
C0161
C0162
C0163
C0164
C0165
C0166
C0167
C0168
C0169
C0170
C0171
C0172
C0173
)

View File

@@ -7,6 +7,7 @@ import (
"os"
"path/filepath"
"runtime"
"strconv"
"strings"
"sync"
"time"
@@ -49,7 +50,8 @@ type LogEntry struct {
Level string `json:"level"`
Timestamp string `json:"timestamp"`
Component string `json:"component,omitempty"`
Message string `json:"message"`
Code int `json:"code,omitempty"`
Message string `json:"message,omitempty"`
Fields map[string]interface{} `json:"fields,omitempty"`
Caller string `json:"caller,omitempty"`
}
@@ -106,9 +108,9 @@ func EnableFileLoggingWithRotation(filePath string, maxSizeMB, maxAgeDays int) e
logger.maxSizeBytes = int64(maxSizeMB) * 1024 * 1024
logger.maxAgeDays = maxAgeDays
if err := logger.cleanupOldLogFiles(); err != nil {
log.Println("Failed to clean up old log files:", err)
log.Println(C0145, err)
}
log.Println("File logging enabled:", filePath)
log.Println(C0146, filePath)
return nil
}
@@ -122,20 +124,28 @@ func DisableFileLogging() {
logger.filePath = ""
logger.maxSizeBytes = 0
logger.maxAgeDays = 0
log.Println("File logging disabled")
log.Println(C0147)
}
}
func logMessage(level LogLevel, component string, message string, fields map[string]interface{}) {
func logMessage(level LogLevel, component string, code CodeID, fields map[string]interface{}) {
if level < currentLevel {
return
}
if fields == nil {
fields = map[string]interface{}{}
}
entryCode := int(code)
entryMessage := extractSystemError(fields)
entry := LogEntry{
Level: logLevelNames[level],
Timestamp: time.Now().UTC().Format(time.RFC3339),
Component: component,
Message: message,
Code: entryCode,
Message: entryMessage,
Fields: fields,
}
@@ -150,7 +160,7 @@ func logMessage(level LogLevel, component string, message string, fields map[str
jsonData, err := json.Marshal(entry)
if err == nil {
if err := logger.writeLine(append(jsonData, '\n')); err != nil {
log.Println("Failed to write file log:", err)
log.Println(C0148, err)
}
}
}
@@ -164,9 +174,12 @@ func logMessage(level LogLevel, component string, message string, fields map[str
entry.Timestamp,
logLevelNames[level],
formatComponent(component),
message,
formatCode(entry.Code),
fieldStr,
)
if entry.Message != "" {
logLine += " msg=" + entry.Message
}
log.Println(logLine)
@@ -175,6 +188,24 @@ func logMessage(level LogLevel, component string, message string, fields map[str
}
}
func extractSystemError(fields map[string]interface{}) string {
if fields == nil {
return ""
}
v, ok := fields[FieldError]
if !ok || v == nil {
return ""
}
return strings.TrimSpace(fmt.Sprintf("%v", v))
}
func formatCode(code int) string {
if code <= 0 {
return "code=0"
}
return "code=" + strconv.Itoa(code)
}
func (l *Logger) writeLine(line []byte) error {
l.fileMu.Lock()
defer l.fileMu.Unlock()
@@ -272,82 +303,82 @@ func formatFields(fields map[string]interface{}) string {
return fmt.Sprintf("{%s}", strings.Join(parts, ", "))
}
func Debug(message string) {
logMessage(DEBUG, "", message, nil)
func Debug(code CodeID) {
logMessage(DEBUG, "", code, nil)
}
func DebugC(component string, message string) {
logMessage(DEBUG, component, message, nil)
func DebugC(component string, code CodeID) {
logMessage(DEBUG, component, code, nil)
}
func DebugF(message string, fields map[string]interface{}) {
logMessage(DEBUG, "", message, fields)
func DebugF(code CodeID, fields map[string]interface{}) {
logMessage(DEBUG, "", code, fields)
}
func DebugCF(component string, message string, fields map[string]interface{}) {
logMessage(DEBUG, component, message, fields)
func DebugCF(component string, code CodeID, fields map[string]interface{}) {
logMessage(DEBUG, component, code, fields)
}
func Info(message string) {
logMessage(INFO, "", message, nil)
func Info(code CodeID) {
logMessage(INFO, "", code, nil)
}
func InfoC(component string, message string) {
logMessage(INFO, component, message, nil)
func InfoC(component string, code CodeID) {
logMessage(INFO, component, code, nil)
}
func InfoF(message string, fields map[string]interface{}) {
logMessage(INFO, "", message, fields)
func InfoF(code CodeID, fields map[string]interface{}) {
logMessage(INFO, "", code, fields)
}
func InfoCF(component string, message string, fields map[string]interface{}) {
logMessage(INFO, component, message, fields)
func InfoCF(component string, code CodeID, fields map[string]interface{}) {
logMessage(INFO, component, code, fields)
}
func Warn(message string) {
logMessage(WARN, "", message, nil)
func Warn(code CodeID) {
logMessage(WARN, "", code, nil)
}
func WarnC(component string, message string) {
logMessage(WARN, component, message, nil)
func WarnC(component string, code CodeID) {
logMessage(WARN, component, code, nil)
}
func WarnF(message string, fields map[string]interface{}) {
logMessage(WARN, "", message, fields)
func WarnF(code CodeID, fields map[string]interface{}) {
logMessage(WARN, "", code, fields)
}
func WarnCF(component string, message string, fields map[string]interface{}) {
logMessage(WARN, component, message, fields)
func WarnCF(component string, code CodeID, fields map[string]interface{}) {
logMessage(WARN, component, code, fields)
}
func Error(message string) {
logMessage(ERROR, "", message, nil)
func Error(code CodeID) {
logMessage(ERROR, "", code, nil)
}
func ErrorC(component string, message string) {
logMessage(ERROR, component, message, nil)
func ErrorC(component string, code CodeID) {
logMessage(ERROR, component, code, nil)
}
func ErrorF(message string, fields map[string]interface{}) {
logMessage(ERROR, "", message, fields)
func ErrorF(code CodeID, fields map[string]interface{}) {
logMessage(ERROR, "", code, fields)
}
func ErrorCF(component string, message string, fields map[string]interface{}) {
logMessage(ERROR, component, message, fields)
func ErrorCF(component string, code CodeID, fields map[string]interface{}) {
logMessage(ERROR, component, code, fields)
}
func Fatal(message string) {
logMessage(FATAL, "", message, nil)
func Fatal(code CodeID) {
logMessage(FATAL, "", code, nil)
}
func FatalC(component string, message string) {
logMessage(FATAL, component, message, nil)
func FatalC(component string, code CodeID) {
logMessage(FATAL, component, code, nil)
}
func FatalF(message string, fields map[string]interface{}) {
logMessage(FATAL, "", message, fields)
func FatalF(code CodeID, fields map[string]interface{}) {
logMessage(FATAL, "", code, fields)
}
func FatalCF(component string, message string, fields map[string]interface{}) {
logMessage(FATAL, component, message, fields)
func FatalCF(component string, code CodeID, fields map[string]interface{}) {
logMessage(FATAL, component, code, fields)
}