GoLang實現(xiàn)日志收集器流程講解
Go自己動手實現(xiàn)日志收集
看日志是開發(fā)者平時排查BUG所必須的掌握的技能,但是日志是如何來的呢?通過平時開發(fā)者自己打日志,經(jīng)過日志包進行處理,打印日志到控制臺還是記錄日志到文件中!
下面咱就來學一下日志是如何記錄下來的

1. 日志器的接口
? 以下日志器定義了各類日志器的行為,通過RegisterWriter注冊實現(xiàn)了日志器的子類日志器,然后通過Log方法來進行循環(huán)調(diào)用注冊進來的日志收集器的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)建日志器的實例
func NewLogger() *Logger {
return &Logger{}
}2. 命令寫入日志器
? 這個日志器實現(xiàn)了日志器的接口行為write,可以進行日志的寫入,其寫入手法是通過Os包來寫入到命令行(控制臺)中!
// 命令行寫入器
type consoleWriter struct {
}
// 實現(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)建命令行寫入器實例
func NewConsoleWriter() *consoleWriter {
return &consoleWriter{}
}3. 文件寫入日志器
這也是實現(xiàn)了日志器的一個實現(xiàn)類,文件日志器,一種常見的將日志寫入文件記錄的日志收集器。使用前需要先SetFile設置好日志文件名,最后將日志作為字節(jié)寫入到文件中。
// 聲明文件寫入器
type fileWriter struct {
file *os.File
}
// 設置文件寫入器寫入的文件名
func (f *fileWriter) SetFile(filename string) (err error) {
// 如果文件已經(jīng)打開, 關閉前一個文件
if f.file != nil {
f.file.Close()
}
// 創(chuàng)建一個文件并保存文件句柄
f.file, err = os.Create(filename)
// 如果創(chuàng)建的過程出現(xiàn)錯誤, 則返回錯誤
return err
}
// 實現(xiàn)LogWriter的Write()方法
func (f *fileWriter) Write(data interface{}) error {
// 日志文件可能沒有創(chuàng)建成功
if f.file == nil {
// 日志文件沒有準備好
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)建文件寫入器實例
func NewFileWriter() *fileWriter {
return &fileWriter{}
}4. Demo演示
通過New的方式創(chuàng)建日志器,進行注冊到日志器集合中,下面演示了兩種日志器如何使用?。。?/p>
// 創(chuàng)建日志器
func createLogger() *Logger {
// 創(chuàng)建日志器
l := NewLogger()
// 創(chuàng)建命令行寫入器
cw := cmdwriter.NewConsoleWriter()
// 注冊命令行寫入器到日志器中,cw實現(xiàn)了LogWriter接口,故可作為RegisterWriter函數(shù)的參數(shù),類型為Logwriter
l.RegisterWriter(cw)
// 創(chuàng)建文件寫入器
fw := filerwriter.NewFileWriter()
// 設置文件名
if err := fw.SetFile("log.log"); err != nil {
fmt.Println(err)
}
// 注冊文件寫入器到日志器中,fw實現(xiàn)了LogWriter接口
l.RegisterWriter(fw)
return l
}
func main() {
// 準備日志器
l := createLogger()
// 寫一個日志
l.Log("hello")
}
5. 總結(jié)和提高
一個好的日志器功能是可擴展的,上述例子僅只是可以擴展不同種類的日志收集器。
在官方的logger中是可以進行選擇寫入級別的,可以定義一個枚舉,在對應的枚舉寫入級別下,進行對應的權(quán)限寫入,可以改造write方法,而不只是簡單的寫入就完事了。
到此這篇關于GoLang實現(xiàn)日志收集器流程講解的文章就介紹到這了,更多相關Go日志收集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
GoLang并發(fā)編程中條件變量sync.Cond的使用
Go標準庫提供Cond原語的目的是,為等待/通知場景下的并發(fā)問題提供支持,本文主要介紹了Go并發(fā)編程sync.Cond的具體使用,具有一定的參考價值,感興趣的可以了解一下2023-01-01
golang NewRequest/gorequest實現(xiàn)http請求的示例代碼
本文主要介紹了golang NewRequest/gorequest實現(xiàn)http請求的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08

