package main import ( "fmt" "io" "os" "time" ) // LogLevel 日志级别 type LogLevel int const ( LevelInfo LogLevel = iota LevelWarn LevelError ) func (l LogLevel) String() string { switch l { case LevelInfo: return "INFO" case LevelWarn: return "WARN" case LevelError: return "ERROR" default: return "UNKNOWN" } } // Logger 接口:定义日志行为 type Logger interface { Log(level LogLevel, format string, args ...any) Info(format string, args ...any) Warn(format string, args ...any) Error(format string, args ...any) SetMinLevel(level LogLevel) } // defaultLogger 结构体:默认实现 type defaultLogger struct { minLevel LogLevel writer io.Writer } // NewLogger 创建新日志实例,默认输出到 os.Stdout func NewLogger() Logger { return &defaultLogger{ minLevel: LevelInfo, writer: os.Stdout, } } // NewFileLogger 创建写入文件的日志实例 func NewFileLogger(filename string) (Logger, error) { file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { return nil, fmt.Errorf("无法创建日志文件 %s: %w", filename, err) } return &defaultLogger{ minLevel: LevelInfo, writer: file, }, nil } // SetMinLevel 设置最低日志级别 func (l *defaultLogger) SetMinLevel(level LogLevel) { l.minLevel = level } // Log 核心日志方法 func (l *defaultLogger) Log(level LogLevel, format string, args ...any) { if level < l.minLevel { return // 低于最小级别,丢弃 } // 构建日志消息:[时间] [级别] 消息 timestamp := time.Now().Format("2006-01-02 15:04:05") message := fmt.Sprintf(format, args...) line := fmt.Sprintf("[%s] [%s] %s\n", timestamp, level.String(), message) // 写入目标(控制台或文件) fmt.Fprint(l.writer, line) } // 快捷方法 func (l *defaultLogger) Info(format string, args ...any) { l.Log(LevelInfo, format, args...) } func (l *defaultLogger) Warn(format string, args ...any) { l.Log(LevelWarn, format, args...) } func (l *defaultLogger) Error(format string, args ...any) { l.Log(LevelError, format, args...) }