```
feat(log): 实现支持多输出方式的日志系统 - 添加Logger接口定义 - 实现ConsoleLogger控制台输出功能 - 实现FileLogger文件输出功能,支持文件大小限制和轮转 - 实现MultiLogger同时输出到多个目标的功能 - 添加基本日志记录示例和测试用例 ```
This commit is contained in:
parent
cad98babfc
commit
9ac394294a
2
day05/homework/log/app.log
Normal file
2
day05/homework/log/app.log
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
应用启动
|
||||||
|
用户登录
|
||||||
106
day05/homework/log/main.go
Normal file
106
day05/homework/log/main.go
Normal file
@ -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("用户登录")
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user