您好,登錄后才能下訂單哦!
本篇文章和大家了解一下GoLang如何實現日志收集器的流程。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。
看日志是開發者平時排查BUG所必須的掌握的技能,但是日志是如何來的呢?通過平時開發者自己打日志,經過日志包進行處理,打印日志到控制臺還是記錄日志到文件中!
下面咱就來學一下日志是如何記錄下來的
以下日志器定義了各類日志器的行為,通過RegisterWriter
注冊實現了日志器的子類日志器,然后通過Log
方法來進行循環調用注冊進來的日志收集器的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類型的數據寫入日志 func (l *Logger) Log(data interface{}) { // 遍歷所有注冊的寫入器 for _, writer := range l.writerList { // 將日志輸出到每一個寫入器中 writer.Write(data) } } // 創建日志器的實例 func NewLogger() *Logger { return &Logger{} }
這個日志器實現了日志器的接口行為write
,可以進行日志的寫入,其寫入手法是通過Os
包來寫入到命令行(控制臺)中!
// 命令行寫入器 type consoleWriter struct { } // 實現LogWriter的Write()方法 func (f *consoleWriter) Write(data interface{}) error { // 將數據序列化為字符串 str := fmt.Sprintf("%v\n", data) // 將數據以字節數組寫入命令行中 _, err := os.Stdout.Write([]byte(str)) return err } // 創建命令行寫入器實例 func NewConsoleWriter() *consoleWriter { return &consoleWriter{} }
這也是實現了日志器的一個實現類,文件日志器,一種常見的將日志寫入文件記錄的日志收集器。使用前需要先SetFile
設置好日志文件名,最后將日志作為字節寫入到文件中。
// 聲明文件寫入器 type fileWriter struct { file *os.File } // 設置文件寫入器寫入的文件名 func (f *fileWriter) SetFile(filename string) (err error) { // 如果文件已經打開, 關閉前一個文件 if f.file != nil { f.file.Close() } // 創建一個文件并保存文件句柄 f.file, err = os.Create(filename) // 如果創建的過程出現錯誤, 則返回錯誤 return err } // 實現LogWriter的Write()方法 func (f *fileWriter) Write(data interface{}) error { // 日志文件可能沒有創建成功 if f.file == nil { // 日志文件沒有準備好 return errors.New("file not created") } // 將數據序列化為字符串 str := fmt.Sprintf("%v\n", data) // 將數據以字節數組寫入文件中 _, err := f.file.Write([]byte(str)) return err } // 創建文件寫入器實例 func NewFileWriter() *fileWriter { return &fileWriter{} }
通過New的方式創建日志器,進行注冊到日志器集合中,下面演示了兩種日志器如何使用!!!
// 創建日志器 func createLogger() *Logger { // 創建日志器 l := NewLogger() // 創建命令行寫入器 cw := cmdwriter.NewConsoleWriter() // 注冊命令行寫入器到日志器中,cw實現了LogWriter接口,故可作為RegisterWriter函數的參數,類型為Logwriter l.RegisterWriter(cw) // 創建文件寫入器 fw := filerwriter.NewFileWriter() // 設置文件名 if err := fw.SetFile("log.log"); err != nil { fmt.Println(err) } // 注冊文件寫入器到日志器中,fw實現了LogWriter接口 l.RegisterWriter(fw) return l } func main() { // 準備日志器 l := createLogger() // 寫一個日志 l.Log("hello") }
一個好的日志器功能是可擴展的,上述例子僅只是可以擴展不同種類的日志收集器。
在官方的logger中是可以進行選擇寫入級別的,可以定義一個枚舉,在對應的枚舉寫入級別下,進行對應的權限寫入,可以改造write方法,而不只是簡單的寫入就完事了。
以上就是GoLang如何實現日志收集器的流程的簡略介紹,當然詳細使用上面的不同還得要大家自己使用過才領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。