0%

Go_模块化_日志管理

Go_模块化_日志管理

// LogSet  日志输出
type LogSet struct {
infoLogger *log.Logger
warningLogger *log.Logger
errorLogger *log.Logger
logFile *os.File
}


// 创建全局变量
var eLogs *LogSet
// 使用init函数 初始化log
func init() {
eLogs = NewLogger("./logs")
}



func NewLogger(logDir string) *LogSet {
// 创建日志目录
if err := os.MkdirAll(logDir, 0755); err != nil {
log.Fatal("无法创建日志目录:", err)
}

// 创建日志文件(按日期命名)
logFileName := filepath.Join(logDir, time.Now().Format("2006-01-02")+".log")
file, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal("无法创建日志文件:", err)
}
// 同时输出到控制台和文件
infoWriter := io.MultiWriter(os.Stdout, file)
warningWriter := io.MultiWriter(os.Stdout, file)
errorWriter := io.MultiWriter(os.Stderr, file)

return &LogSet{
infoLogger: log.New(infoWriter, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile),
warningLogger: log.New(warningWriter, "WARNING: ", log.Ldate|log.Ltime|log.Lshortfile),
errorLogger: log.New(errorWriter, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile),
logFile: file,
}
}

// Close 添加关闭方法
func (l *LogSet) Close() {
if l.logFile != nil {
err := l.logFile.Close()
if err != nil {
return
}
}
}

func (l *LogSet) Info(v ...interface{}) {
l.infoLogger.Println(v...)
}
func (l *LogSet) Infof(format string, v ...interface{}) {
l.infoLogger.Printf(format, v...)
}

func (l *LogSet) Warning(v ...interface{}) {
l.warningLogger.Println(v...)
}

func (l *LogSet) Warningf(format string, v ...interface{}) {
l.warningLogger.Printf(format, v...)
}

func (l *LogSet) Error(v ...interface{}) {
l.errorLogger.Println(v...)
}

func (l *LogSet) Errorf(format string, v ...interface{}) {
l.errorLogger.Printf(format, v...)
}

func main() {
// 创建日志器,指定日志目录

// 创建日志:
// 如果没有在 init 中初始化,可以在这里初始化
if eLogs == nil {
eLogs = NewLogger("./logs")
}
defer eLogs.Close() // 确保关闭文件


// 下面正常调用
eLogs.Infof("应用启动成功")
eLogs.Warning("这是警告信息")
eLogs.Error("这是错误信息")

// 其中:Error、Errorf 的区别,主要说明示例
// 例子:
userID := 123
action := "删除"

// Error 的输出
eLogs.Error("用户ID:", userID, "操作:", action)
// 输出: ERROR: 2024/01/15 10:30:45 用户ID: 123 操作: 删除

// Errorf 的输出
eLogs.Errorf("用户ID: %d, 操作: %s", userID, action)
// 输出: ERROR: 2024/01/15 10:30:45 用户ID: 123, 操作: 删除

// 更复杂的例子
eLogs.Error("连接失败", "重试次数", 3, "错误", "timeout")
// 输出: ERROR: 2024/01/15 10:30:45 连接失败 重试次数 3 错误 timeout

eLogs.Errorf("连接失败,重试次数: %d, 错误: %s", 3, "timeout")
// 输出: ERROR: 2024/01/15 10:30:45 连接失败,重试次数: 3, 错误: timeout
}