一,程式碼
1,全域性檔案:
// 日誌訊息結構體
type LogMessage struct {
Level string
Message 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 error
config.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 channel
config.LogChan = make(chan config.LogMessage, 1000)
// 啟動非同步日誌goroutine
go 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 error
config.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] 這是一條錯誤資訊.