golang使用tail實現(xiàn)追蹤文件變更
簡介
借助 github.com/hpcloud/tail
,可以實時追蹤文件變更,達(dá)到類似shell命令tail -f
的效果。
示例代碼
以下示例代碼用于實時讀取nginx的access.log
日志文件,讀取到后輸出到控制臺。如果nginx日志做了json格式化,還可以解析讀取到的內(nèi)容,對日志進(jìn)行更多處理,比如日志內(nèi)容寫入數(shù)據(jù)庫、做日志告警等,對于訪問量較小的系統(tǒng)來說,這樣就不需要消耗很多資源去搭建ELK、Loki等專門的日志監(jiān)控系統(tǒng)。
package main import ( "flag" "fmt" "io" "os" "github.com/hpcloud/tail" ) var ( logfile = flag.String("f", "access.log", "日志文件路徑") ) func main() { flag.Parse() // 判斷文件是否存在 if _, err := os.Stat(*logfile); os.IsNotExist(err) { fmt.Printf("Error! %s not found\n", *logfile) os.Exit(1) } // 不從文件開始讀, 而是從文件當(dāng)前末尾開始讀 // Go 1.20推薦使用 io.SeekEnd, 老版本可能需要改為os.SEEK_END seek := &tail.SeekInfo{Offset: 0, Whence: io.SeekEnd} t, err := tail.TailFile(*logfile, tail.Config{ Follow: true, Location: seek, }) if err != nil { fmt.Println(err) } for line := range t.Lines { fmt.Println(line.Text) } }
知識補(bǔ)充
1.官方文檔
2.github.com/hpcloud/tail 使用介紹
地址:https://github.com/hpcloud/tail
linux中的tail命令用途是依照要求將指定的文件的最后部分輸出到標(biāo)準(zhǔn)設(shè)備,通常是終端,通俗講來,就是把某個檔案文件的最后幾行顯示到終端上,假設(shè)該檔案有更新,tail會自己主動刷新,確保你看到最新的檔案內(nèi)容。
這個包實現(xiàn)了類似的功能。
t, err := tail.TailFile("/var/log/nginx.log", tail.Config{Follow: true}) if err != nil { fmt.Println(err) //如果文件不存在,會阻塞并打印Waiting for my.log to appear...,直到文件被創(chuàng)建 } for line := range t.Lines { fmt.Println(line.Text) }
tail.TailFile()函數(shù)開啟goroutine去讀取文件,通過channel格式的t.lines傳遞內(nèi)容。
其他配置項
type Config struct { // File-specifc Location *SeekInfo // 指定開始讀取的位置 ReOpen bool //true則文件被刪掉阻塞等待新建該文件,false則文件被刪掉時程序結(jié)束 MustExist bool //true則沒有找到文件就報錯并結(jié)束,false則沒有找到文件就阻塞保持住 Poll bool // 使用Linux的Poll函數(shù),poll的作用是把當(dāng)前的文件指針掛到等待隊列 Pipe bool // Is a named pipe (mkfifo) RateLimiter *ratelimiter.LeakyBucket // Generic IO Follow bool //true則一直阻塞并監(jiān)聽指定文件,false則一次讀完就結(jié)束程序 MaxLineSize int // If non-zero, split longer lines into multiple lines // Logger, when nil, is set to tail.DefaultLogger // To disable logging: set field to tail.DiscardingLogger Logger logger }
location類似os.seek,舉例
seek := &tail.SeekInfo{Offset:5,Whence:os.SEEK_CUR} t, err := tail.TailFile("my.log", tail.Config{Location:seek}) offset //Whence之后,再偏移n個字符開始讀,偏移量大于一行內(nèi)容時換行繼續(xù)計算(換行符\n計算在內(nèi)占兩個字符,但是不打印出來) SEEK_SET int = 0 // 跳到文件的開始位置 SEEK_CUR int = 1 // 跳到文件的當(dāng)前位置(好像和設(shè)置為開始位置一樣) SEEK_END int = 2 // 跳到文件最后,不讀取文件里原有的內(nèi)容,從新加入的開始讀
t.Tell()返回當(dāng)前offset
到此這篇關(guān)于golang使用tail實現(xiàn)追蹤文件變更的文章就介紹到這了,更多相關(guān)golang tail內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語言通過odbc操作Access數(shù)據(jù)庫的方法
這篇文章主要介紹了go語言通過odbc操作Access數(shù)據(jù)庫的方法,實例分析了Go語言通過odbc連接、查詢與關(guān)閉access數(shù)據(jù)庫的技巧,需要的朋友可以參考下2015-03-03Go語言映射內(nèi)部實現(xiàn)及基礎(chǔ)功能實戰(zhàn)
這篇文章主要為大家介紹了Go語言映射的內(nèi)部實現(xiàn)和基礎(chǔ)功能實戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-03-03Go?Gin框架優(yōu)雅重啟和停止實現(xiàn)方法示例
Web應(yīng)用程序中,有時需要重啟或停止服務(wù)器,無論是因為更新代碼還是進(jìn)行例行維護(hù),這時需要保證應(yīng)用程序的可用性和數(shù)據(jù)的一致性,就需要優(yōu)雅地關(guān)閉和重啟應(yīng)用程序,即不丟失正在處理的請求和不拒絕新的請求,本文將詳解如何在Go語言中使用Gin這個框架實現(xiàn)優(yōu)雅的重啟停止2024-01-01詳解Go語言如何使用標(biāo)準(zhǔn)庫sort對切片進(jìn)行排序
Sort?標(biāo)準(zhǔn)庫提供了對基本數(shù)據(jù)類型的切片和自定義類型的切片進(jìn)行排序的函數(shù)。今天主要分享的內(nèi)容是使用?Go?標(biāo)準(zhǔn)庫?sort?對切片進(jìn)行排序,感興趣的可以了解一下2022-12-12Golang實現(xiàn)多存儲驅(qū)動設(shè)計SDK案例
這篇文章主要介紹了Golang實現(xiàn)多存儲驅(qū)動設(shè)計SDK案例,Gocache是一個基于Go語言編寫的多存儲驅(qū)動的緩存擴(kuò)展組件,更多具體內(nèi)容感興趣的小伙伴可以參考一下2022-09-09