初始化Go学习项目

This commit is contained in:
liumangmang
2025-12-26 17:56:02 +08:00
commit 7f4527d501
90 changed files with 3436 additions and 0 deletions

3
go-mini-logger/app.log Normal file
View 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
View File

@@ -0,0 +1,3 @@
module go-mini-logger
go 1.22.2

90
go-mini-logger/logger.go Normal file
View 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
View 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 可验证文件日志内容")
}