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 } // 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 } // 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 }