初始化Go学习项目
This commit is contained in:
90
go-mini-logger/logger.go
Normal file
90
go-mini-logger/logger.go
Normal file
@@ -0,0 +1,90 @@
|
||||
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...) }
|
||||
Reference in New Issue
Block a user