90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
// Package gologger provides a simple logging implementation with multiple appenders and formatters.
|
|
// It supports console, file, and HTTP logging with customizable formats.
|
|
package gologger
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// LogFormatter is a function type that formats a LogEvent into a string.
|
|
// Example:
|
|
//
|
|
// formatter := func(event LogEvent) string {
|
|
// return fmt.Sprintf("[%s] %s: %v", event.Ts.Format("2006-01-02"), event.Level, event.Data)
|
|
// }
|
|
type LogFormatter = func(LogEvent) string
|
|
|
|
const logTemplate = "[%s] %s : %s - %s\n"
|
|
|
|
// format is the default formatter that converts a LogEvent to a string using the default template.
|
|
// It handles both simple values and formatted strings.
|
|
// Template: "[timestamp] level : category - data"
|
|
func format(logEvent LogEvent) string {
|
|
data := logEvent.Ts.Format("2006-01-02 15:04:05")
|
|
var msg string
|
|
if len(logEvent.Data) > 0 {
|
|
firstMsg := logEvent.Data[0]
|
|
if isFormatString(firstMsg) {
|
|
msg = fmt.Sprintf(firstMsg.(string), logEvent.Data[1:]...)
|
|
} else {
|
|
msg = sprint(logEvent.Data)
|
|
}
|
|
}
|
|
|
|
return fmt.Sprintf(logTemplate, data, logEvent.Category, getLogLevelStr(logEvent.Level), msg)
|
|
}
|
|
|
|
func getLogLevelStr(level int) string {
|
|
for name, slevel := range logLevelMap {
|
|
if slevel == level {
|
|
return strings.ToUpper(name)
|
|
}
|
|
}
|
|
return "Unknown"
|
|
}
|
|
|
|
func isFormatString(f any) bool {
|
|
s, ok := f.(string)
|
|
if !ok {
|
|
return false
|
|
}
|
|
// 检查是否包含常见格式化动词
|
|
return strings.Contains(s, "%s") || strings.Contains(s, "%d") ||
|
|
strings.Contains(s, "%v") || strings.Contains(s, "%f") ||
|
|
strings.Contains(s, "%x") || strings.Contains(s, "%t") ||
|
|
strings.Contains(s, "%c") || strings.Contains(s, "%b") ||
|
|
strings.Contains(s, "%e") || strings.Contains(s, "%g")
|
|
}
|
|
|
|
func sprint(s []any) string {
|
|
var b strings.Builder
|
|
for i, v := range s {
|
|
if i > 0 {
|
|
b.WriteString(" ")
|
|
}
|
|
fmt.Fprintf(&b, "%v", v)
|
|
}
|
|
return b.String()
|
|
}
|
|
|
|
func jsonFormatter(logEvent LogEvent) string {
|
|
d, err := json.Marshal(logEvent)
|
|
if err != nil {
|
|
return fmt.Sprintf(`{"error":"%v"}`, logEvent.Data)
|
|
}
|
|
return string(d)
|
|
}
|
|
|
|
func SelectFormatter(formatter string) LogFormatter {
|
|
switch strings.ToLower(formatter) {
|
|
case "json":
|
|
return jsonFormatter
|
|
case "text":
|
|
return format
|
|
default:
|
|
return format
|
|
}
|
|
}
|