91 lines
2.1 KiB
Go
91 lines
2.1 KiB
Go
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...) }
|