golang使用tail實現(xiàn)追蹤文件變更
簡介
借助 github.com/hpcloud/tail
,可以實時追蹤文件變更,達到類似shell命令tail -f
的效果。
示例代碼
以下示例代碼用于實時讀取nginx的access.log
日志文件,讀取到后輸出到控制臺。如果nginx日志做了json格式化,還可以解析讀取到的內(nèi)容,對日志進行更多處理,比如日志內(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) } // 不從文件開始讀, 而是從文件當前末尾開始讀 // 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) } }
知識補充
1.官方文檔
2.github.com/hpcloud/tail 使用介紹
地址:https://github.com/hpcloud/tail
linux中的tail命令用途是依照要求將指定的文件的最后部分輸出到標準設備,通常是終端,通俗講來,就是把某個檔案文件的最后幾行顯示到終端上,假設該檔案有更新,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則文件被刪掉時程序結束 MustExist bool //true則沒有找到文件就報錯并結束,false則沒有找到文件就阻塞保持住 Poll bool // 使用Linux的Poll函數(shù),poll的作用是把當前的文件指針掛到等待隊列 Pipe bool // Is a named pipe (mkfifo) RateLimiter *ratelimiter.LeakyBucket // Generic IO Follow bool //true則一直阻塞并監(jiān)聽指定文件,false則一次讀完就結束程序 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 // 跳到文件的當前位置(好像和設置為開始位置一樣) SEEK_END int = 2 // 跳到文件最后,不讀取文件里原有的內(nèi)容,從新加入的開始讀
t.Tell()返回當前offset
到此這篇關于golang使用tail實現(xiàn)追蹤文件變更的文章就介紹到這了,更多相關golang tail內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
go語言通過odbc操作Access數(shù)據(jù)庫的方法
這篇文章主要介紹了go語言通過odbc操作Access數(shù)據(jù)庫的方法,實例分析了Go語言通過odbc連接、查詢與關閉access數(shù)據(jù)庫的技巧,需要的朋友可以參考下2015-03-03Go語言映射內(nèi)部實現(xiàn)及基礎功能實戰(zhàn)
這篇文章主要為大家介紹了Go語言映射的內(nèi)部實現(xiàn)和基礎功能實戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2022-03-03Go?Gin框架優(yōu)雅重啟和停止實現(xiàn)方法示例
Web應用程序中,有時需要重啟或停止服務器,無論是因為更新代碼還是進行例行維護,這時需要保證應用程序的可用性和數(shù)據(jù)的一致性,就需要優(yōu)雅地關閉和重啟應用程序,即不丟失正在處理的請求和不拒絕新的請求,本文將詳解如何在Go語言中使用Gin這個框架實現(xiàn)優(yōu)雅的重啟停止2024-01-01