溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

GoLang如何實(shí)現(xiàn)日志收集器的流程

發(fā)布時間:2023-10-16 17:21:18 來源:億速云 閱讀:124 作者:栢白 欄目:開發(fā)技術(shù)

本篇文章和大家了解一下GoLang如何實(shí)現(xiàn)日志收集器的流程。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

Go自己動手實(shí)現(xiàn)日志收集

看日志是開發(fā)者平時排查BUG所必須的掌握的技能,但是日志是如何來的呢?通過平時開發(fā)者自己打日志,經(jīng)過日志包進(jìn)行處理,打印日志到控制臺還是記錄日志到文件中!

下面咱就來學(xué)一下日志是如何記錄下來的

GoLang如何實(shí)現(xiàn)日志收集器的流程

1. 日志器的接口

以下日志器定義了各類日志器的行為,通過RegisterWriter注冊實(shí)現(xiàn)了日志器的子類日志器,然后通過Log方法來進(jìn)行循環(huán)調(diào)用注冊進(jìn)來的日志收集器的write寫日志方法。

// 聲明日志寫入器接口
type LogWriter interface {
	Write(data interface{}) error
}
// 日志器
type Logger struct {
	// 這個日志器用到的日志寫入器
	writerList []LogWriter
}
// 注冊一個日志寫入器
func (l *Logger) RegisterWriter(writer LogWriter) {
	l.writerList = append(l.writerList, writer)
}
// 將一個data類型的數(shù)據(jù)寫入日志
func (l *Logger) Log(data interface{}) {
	// 遍歷所有注冊的寫入器
	for _, writer := range l.writerList {
		// 將日志輸出到每一個寫入器中
		writer.Write(data)
	}
}
// 創(chuàng)建日志器的實(shí)例
func NewLogger() *Logger {
	return &Logger{}
}

2. 命令寫入日志器

這個日志器實(shí)現(xiàn)了日志器的接口行為write,可以進(jìn)行日志的寫入,其寫入手法是通過Os包來寫入到命令行(控制臺)中!

// 命令行寫入器
type consoleWriter struct {
}
// 實(shí)現(xiàn)LogWriter的Write()方法
func (f *consoleWriter) Write(data interface{}) error {
	// 將數(shù)據(jù)序列化為字符串
	str := fmt.Sprintf("%v\n", data)
	// 將數(shù)據(jù)以字節(jié)數(shù)組寫入命令行中
	_, err := os.Stdout.Write([]byte(str))
	return err
}
// 創(chuàng)建命令行寫入器實(shí)例
func NewConsoleWriter() *consoleWriter {
	return &consoleWriter{}
}

3. 文件寫入日志器

這也是實(shí)現(xiàn)了日志器的一個實(shí)現(xiàn)類,文件日志器,一種常見的將日志寫入文件記錄的日志收集器。使用前需要先SetFile設(shè)置好日志文件名,最后將日志作為字節(jié)寫入到文件中。

// 聲明文件寫入器
type fileWriter struct {
	file *os.File
}
// 設(shè)置文件寫入器寫入的文件名
func (f *fileWriter) SetFile(filename string) (err error) {
	// 如果文件已經(jīng)打開, 關(guān)閉前一個文件
	if f.file != nil {
		f.file.Close()
	}
	// 創(chuàng)建一個文件并保存文件句柄
	f.file, err = os.Create(filename)
	// 如果創(chuàng)建的過程出現(xiàn)錯誤, 則返回錯誤
	return err
}
// 實(shí)現(xiàn)LogWriter的Write()方法
func (f *fileWriter) Write(data interface{}) error {
	// 日志文件可能沒有創(chuàng)建成功
	if f.file == nil {
		// 日志文件沒有準(zhǔn)備好
		return errors.New("file not created")
	}
	// 將數(shù)據(jù)序列化為字符串
	str := fmt.Sprintf("%v\n", data)
	// 將數(shù)據(jù)以字節(jié)數(shù)組寫入文件中
	_, err := f.file.Write([]byte(str))
	return err
}
// 創(chuàng)建文件寫入器實(shí)例
func NewFileWriter() *fileWriter {
	return &fileWriter{}
}

4. Demo演示

通過New的方式創(chuàng)建日志器,進(jìn)行注冊到日志器集合中,下面演示了兩種日志器如何使用?。?!

// 創(chuàng)建日志器
func createLogger() *Logger {
	// 創(chuàng)建日志器
	l := NewLogger()
	// 創(chuàng)建命令行寫入器
	cw := cmdwriter.NewConsoleWriter()
	// 注冊命令行寫入器到日志器中,cw實(shí)現(xiàn)了LogWriter接口,故可作為RegisterWriter函數(shù)的參數(shù),類型為Logwriter
	l.RegisterWriter(cw)
	// 創(chuàng)建文件寫入器
	fw := filerwriter.NewFileWriter()
	// 設(shè)置文件名
	if err := fw.SetFile("log.log"); err != nil {
		fmt.Println(err)
	}
	// 注冊文件寫入器到日志器中,fw實(shí)現(xiàn)了LogWriter接口
	l.RegisterWriter(fw)
	return l
}
func main() {
	// 準(zhǔn)備日志器
	l := createLogger()
	// 寫一個日志
	l.Log("hello")
}

GoLang如何實(shí)現(xiàn)日志收集器的流程

5. 總結(jié)和提高

一個好的日志器功能是可擴(kuò)展的,上述例子僅只是可以擴(kuò)展不同種類的日志收集器。

在官方的logger中是可以進(jìn)行選擇寫入級別的,可以定義一個枚舉,在對應(yīng)的枚舉寫入級別下,進(jìn)行對應(yīng)的權(quán)限寫入,可以改造write方法,而不只是簡單的寫入就完事了。

以上就是GoLang如何實(shí)現(xiàn)日志收集器的流程的簡略介紹,當(dāng)然詳細(xì)使用上面的不同還得要大家自己使用過才領(lǐng)會。如果想了解更多,歡迎關(guān)注億速云行業(yè)資訊頻道哦!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI