fscan/Common/logging/Formatter.go
ZacharyZcR e095f376f9 refactor: 重构日志和输出系统,优化日志级别和时间显示
主要更改:
- 重构Log.go和Output.go为模块化架构
- 创建独立的logging和output模块
- 新增LevelBaseInfoSuccess默认日志级别(显示BASE、INFO、SUCCESS)
- 添加运行时间显示到每条日志前面
- 保持完全向后兼容的API接口
- 支持多种输出格式(TXT、JSON、CSV)
- 优化日志格式化和颜色显示

技术改进:
- 模块化设计便于扩展和维护
- 智能时间格式化(毫秒→秒→分钟→小时)
- 支持缓冲和批量输出
- 线程安全的并发处理
2025-08-05 02:14:25 +08:00

141 lines
3.5 KiB
Go

package logging
import (
"fmt"
"time"
)
// StandardFormatter 标准日志格式化器
type StandardFormatter struct {
startTime time.Time
}
// NewStandardFormatter 创建标准格式化器
func NewStandardFormatter() *StandardFormatter {
return &StandardFormatter{
startTime: time.Now(),
}
}
// SetStartTime 设置开始时间
func (f *StandardFormatter) SetStartTime(startTime time.Time) {
f.startTime = startTime
}
// Format 格式化日志条目
func (f *StandardFormatter) Format(entry *LogEntry) string {
elapsed := time.Since(f.startTime)
timeStr := f.formatElapsedTime(elapsed)
prefix := f.getLevelPrefix(entry.Level)
return fmt.Sprintf("[%s] %s %s", timeStr, prefix, entry.Content)
}
// formatElapsedTime 格式化经过的时间
func (f *StandardFormatter) formatElapsedTime(elapsed time.Duration) string {
switch {
case elapsed < time.Second:
// 毫秒显示,不需要小数
return fmt.Sprintf("%dms", elapsed.Milliseconds())
case elapsed < time.Minute:
// 秒显示,保留一位小数
return fmt.Sprintf("%.1fs", elapsed.Seconds())
case elapsed < time.Hour:
// 分钟和秒显示
minutes := int(elapsed.Minutes())
seconds := int(elapsed.Seconds()) % 60
return fmt.Sprintf("%dm%ds", minutes, seconds)
default:
// 小时、分钟和秒显示
hours := int(elapsed.Hours())
minutes := int(elapsed.Minutes()) % 60
seconds := int(elapsed.Seconds()) % 60
return fmt.Sprintf("%dh%dm%ds", hours, minutes, seconds)
}
}
// getLevelPrefix 获取日志级别前缀
func (f *StandardFormatter) getLevelPrefix(level LogLevel) string {
switch level {
case LevelSuccess:
return "[+]"
case LevelInfo:
return "[*]"
case LevelError:
return "[-]"
default:
return " "
}
}
// DetailedFormatter 详细日志格式化器
type DetailedFormatter struct {
StandardFormatter
includeSource bool
includeMetadata bool
}
// NewDetailedFormatter 创建详细格式化器
func NewDetailedFormatter(includeSource, includeMetadata bool) *DetailedFormatter {
return &DetailedFormatter{
StandardFormatter: StandardFormatter{startTime: time.Now()},
includeSource: includeSource,
includeMetadata: includeMetadata,
}
}
// Format 格式化日志条目(包含详细信息)
func (f *DetailedFormatter) Format(entry *LogEntry) string {
baseFormat := f.StandardFormatter.Format(entry)
if f.includeSource && entry.Source != "" {
baseFormat += fmt.Sprintf(" [%s]", entry.Source)
}
if f.includeMetadata && len(entry.Metadata) > 0 {
baseFormat += fmt.Sprintf(" %v", entry.Metadata)
}
return baseFormat
}
// JSONFormatter JSON格式化器
type JSONFormatter struct {
startTime time.Time
}
// NewJSONFormatter 创建JSON格式化器
func NewJSONFormatter() *JSONFormatter {
return &JSONFormatter{
startTime: time.Now(),
}
}
// SetStartTime 设置开始时间
func (f *JSONFormatter) SetStartTime(startTime time.Time) {
f.startTime = startTime
}
// Format 格式化为JSON格式
func (f *JSONFormatter) Format(entry *LogEntry) string {
elapsed := time.Since(f.startTime)
jsonStr := fmt.Sprintf(`{"level":"%s","time":"%s","elapsed_ms":%d,"content":"%s"`,
entry.Level,
entry.Time.Format("2006-01-02T15:04:05.000Z07:00"),
elapsed.Milliseconds(),
entry.Content)
if entry.Source != "" {
jsonStr += fmt.Sprintf(`,"source":"%s"`, entry.Source)
}
if len(entry.Metadata) > 0 {
jsonStr += `,"metadata":`
// 这里为简化处理,使用简单的格式
jsonStr += fmt.Sprintf(`%v`, entry.Metadata)
}
jsonStr += "}"
return jsonStr
}