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("用户登录") +}