您好,登錄后才能下訂單哦!
本篇文章和大家了解一下GoLang如何實(shí)現(xiàn)日志收集器的流程。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。
看日志是開發(fā)者平時排查BUG所必須的掌握的技能,但是日志是如何來的呢?通過平時開發(fā)者自己打日志,經(jīng)過日志包進(jìn)行處理,打印日志到控制臺還是記錄日志到文件中!
下面咱就來學(xué)一下日志是如何記錄下來的
以下日志器定義了各類日志器的行為,通過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{} }
這個日志器實(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{} }
這也是實(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{} }
通過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") }
一個好的日志器功能是可擴(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è)資訊頻道哦!
免責(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)容。