一,代码
1,全局文件:
// 日志消息结构体
type LogMessage struct {Level stringMessage string
}//通道
var LogChan chan LogMessage//日志文件句柄
var GlobalLogFile *os.File// 异步日志函数
func AsyncLog(logCh chan LogMessage) {for {select {case msg := <-logCh:// 获取当前时间now := time.Now()nowTime:=now.Format("2006-01-02 15:04:05")fmt.Println("协程中接收到了消息:"+nowTime)writeString, err := GlobalLogFile.WriteString(nowTime + " [" + msg.Level + "] " + msg.Message + "\n")if err != nil {fmt.Printf("写入时报错:",err)}fmt.Println(writeString)}}
}
2,启用协程:
//得到年月日now := time.Now()dateStr:=now.Format("2006-01-02")filePath := "/data/goapp/logs/"+dateStr+".log"// 创建一个日志文件var errLog errorconfig.GlobalLogFile, errLog = os.OpenFile(filePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)if errLog != nil {log.Fatalf("无法打开日志文件:%v", errLog)}defer config.GlobalLogFile.Close()// 创建日志消息的buffered channelconfig.LogChan = make(chan config.LogMessage, 1000)// 启动异步日志goroutinego config.AsyncLog(config.LogChan)
3,发送消息
//得到打开的日志文件的路径origFilePath := config.GlobalLogFile.Name();fmt.Println("日志文件路径:",origFilePath)//得到当前要使用的文件路径:now := time.Now()dateStr:=now.Format("2006-01-02")curFilePath := "/data/goapp/logs/"+dateStr+".log"//如果文件名不一致时重新生成日志文件if curFilePath != origFilePath {//关闭前一个文件句柄config.GlobalLogFile.Close()// 创建一个日志文件var errLog errorconfig.GlobalLogFile, errLog = os.OpenFile(curFilePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)if errLog != nil {log.Fatalf("无法打开日志文件:%v", errLog)}}// 发送日志消息config.LogChan <- config.LogMessage{"INFO", "这是一条info信息."}config.LogChan <- config.LogMessage{"ERROR", "这是一条错误信息."}
二,测试效果
查看文件内容:
2024-11-26 10:21:10 [INFO] 这是一条info信息.
2024-11-26 10:21:10 [ERROR] 这是一条错误信息.
2024-11-26 10:21:16 [INFO] 这是一条info信息.
2024-11-26 10:21:16 [ERROR] 这是一条错误信息.
2024-11-26 10:21:17 [INFO] 这是一条info信息.
2024-11-26 10:21:17 [ERROR] 这是一条错误信息.
2024-11-26 10:21:18 [INFO] 这是一条info信息.
2024-11-26 10:21:18 [ERROR] 这是一条错误信息.
2024-11-26 10:21:20 [INFO] 这是一条info信息.
2024-11-26 10:21:20 [ERROR] 这是一条错误信息.
2024-11-26 10:21:22 [INFO] 这是一条info信息.
2024-11-26 10:21:22 [ERROR] 这是一条错误信息.
2024-11-26 10:21:24 [INFO] 这是一条info信息.
2024-11-26 10:21:24 [ERROR] 这是一条错误信息.