初始化Go学习项目
This commit is contained in:
3
go-mini-logger/app.log
Normal file
3
go-mini-logger/app.log
Normal file
@@ -0,0 +1,3 @@
|
||||
[2025-12-22 17:16:55] [INFO] 应用开始处理请求
|
||||
[2025-12-22 17:16:55] [WARN] 用户 liumangmang 尝试越权操作
|
||||
[2025-12-22 17:16:55] [ERROR] 写入数据库时发生唯一键冲突
|
||||
3
go-mini-logger/go.mod
Normal file
3
go-mini-logger/go.mod
Normal file
@@ -0,0 +1,3 @@
|
||||
module go-mini-logger
|
||||
|
||||
go 1.22.2
|
||||
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...) }
|
||||
35
go-mini-logger/main.go
Normal file
35
go-mini-logger/main.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println("=== 1. 控制台日志 ===")
|
||||
consoleLogger := NewLogger()
|
||||
consoleLogger.Info("程序启动,PID: %d", os.Getpid())
|
||||
consoleLogger.Warn("磁盘使用率超过 80%")
|
||||
consoleLogger.Error("数据库连接失败: timeout")
|
||||
|
||||
fmt.Println("\n=== 2. 设置最低级别为 WARN ===")
|
||||
consoleLogger.SetMinLevel(LevelWarn)
|
||||
consoleLogger.Info("这条不会显示") // 被过滤
|
||||
consoleLogger.Warn("这条会显示") // 显示
|
||||
consoleLogger.Error("错误也会显示") // 显示
|
||||
|
||||
fmt.Println("\n=== 3. 文件日志(写入 app.log)===")
|
||||
fileLogger, err := NewFileLogger("app.log")
|
||||
if err != nil {
|
||||
consoleLogger.Error("无法创建文件日志: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
fileLogger.Info("应用开始处理请求")
|
||||
fileLogger.Warn("用户 %s 尝试越权操作", "liumangmang")
|
||||
fileLogger.Error("写入数据库时发生唯一键冲突")
|
||||
|
||||
fmt.Println("日志已写入 app.log,请查看内容:")
|
||||
os.ReadFile("app.log") // 不打印,仅确保写入
|
||||
fmt.Println("✅ 查看 app.log 可验证文件日志内容")
|
||||
}
|
||||
Reference in New Issue
Block a user