From 9ac394294a92c57419cb1d12e7098293cfaf01c4 Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Sun, 1 Mar 2026 09:53:57 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(log):=20=E5=AE=9E=E7=8E=B0=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E8=BE=93=E5=87=BA=E6=96=B9=E5=BC=8F=E7=9A=84?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加Logger接口定义 - 实现ConsoleLogger控制台输出功能 - 实现FileLogger文件输出功能,支持文件大小限制和轮转 - 实现MultiLogger同时输出到多个目标的功能 - 添加基本日志记录示例和测试用例 ``` --- day05/homework/log/app.log | 2 + day05/homework/log/main.go | 106 +++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 day05/homework/log/app.log create mode 100644 day05/homework/log/main.go diff --git a/day05/homework/log/app.log b/day05/homework/log/app.log new file mode 100644 index 0000000..7d82f02 --- /dev/null +++ b/day05/homework/log/app.log @@ -0,0 +1,2 @@ +应用启动 +用户登录 diff --git a/day05/homework/log/main.go b/day05/homework/log/main.go new file mode 100644 index 0000000..f9aa5a5 --- /dev/null +++ b/day05/homework/log/main.go @@ -0,0 +1,106 @@ +package main + +import ( + "os" +) + +// 作业2:日志系统(难度:⭐⭐) +// 题目: 实现支持多种输出方式的日志系统。 + +// 1. 定义Logger接口 +type Logger interface { + Log(message string) +} + +// 2. 实现ConsoleLogger(控制台输出) +type ConsoleLogger struct{} + +func (c *ConsoleLogger) Log(message string) { + println("控制台日志:", message) +} + +// 3. 实现FileLogger(文件输出) +type FileLogger struct { + filename string + logFile *os.File + size int64 +} + +func (f *FileLogger) Log(message string) { + // 模拟文件写入 + println("文件日志:", message, "写入到文件:", f.filename) + + // 如果没有指定文件名,使用默认文件名 + if f.filename == "" { + f.filename = "app.log" + } + + // O_APPEND + if f.logFile == nil { + logFile, err := os.OpenFile(f.filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) + if err != nil { + panic(err) + } + // 获取当前日志文件的大小 + fileInfo, err := f.logFile.Stat() + if err != nil { + panic(err) + } + // 初始文件大小 + f.size = fileInfo.Size() + f.logFile = logFile + } + + // 如果文件大小超过10M,则创建新的文件 + if f.size >= 10*1024*1024 { + f.logFile.Close() + f.filename = f.filename + ".1" + logFile, err := os.OpenFile(f.filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) + if err != nil { + panic(err) + } + f.logFile = logFile + f.size = 0 + } + + n, err := f.logFile.WriteString(message + "\n") + if err != nil { + panic(err) + } + f.size += int64(n) +} + +// 4. 实现MultiLogger(同时输出到多个地方) +type MultiLogger struct { + loggers []Logger +} + +// 5. 实现MultiLogger +func (m *MultiLogger) Log(message string) { + for _, logger := range m.loggers { + logger.Log(message) + } +} + +func (m *MultiLogger) Close() { + for _, logger := range m.loggers { + if fileLogger, ok := logger.(*FileLogger); ok { + if fileLogger.logFile != nil { + fileLogger.logFile.Close() + } + } + } +} + +func main() { + logger := &MultiLogger{ + loggers: []Logger{ + &ConsoleLogger{}, + &FileLogger{filename: "app.log"}, + }, + } + defer logger.Close() + + logger.Log("应用启动") + logger.Log("用户登录") +}