欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang使用tail實現(xiàn)追蹤文件變更

 更新時間:2023年08月08日 10:49:37   作者:花酒鋤作田  
這篇文章主要為大家介紹了golang如何借助 github.com/hpcloud/tail ,實現(xiàn)實時追蹤文件變更,達(dá)到類似shell命令tail -f的效果,感興趣的小伙伴可以了解一下

簡介

借助 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操作Access數(shù)據(jù)庫的方法,實例分析了Go語言通過odbc連接、查詢與關(guān)閉access數(shù)據(jù)庫的技巧,需要的朋友可以參考下
    2015-03-03
  • 一文詳解go mod依賴管理詳情

    一文詳解go mod依賴管理詳情

    這篇文章主要介紹了一文詳解go mod依賴管理詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • Golang 1.16 中 Modules的主要變化更新

    Golang 1.16 中 Modules的主要變化更新

    這篇文章主要介紹了Golang 1.16 中 Modules的主要變化更新,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Go語言defer語句的三種機(jī)制整理

    Go語言defer語句的三種機(jī)制整理

    在本篇文章里小編給大家分享的是一篇關(guān)于Go語言defer語句的三種機(jī)制整理,需要的朋友們學(xué)習(xí)下吧。
    2020-03-03
  • golang根據(jù)URL獲取文件名的示例代碼

    golang根據(jù)URL獲取文件名的示例代碼

    這篇文章主要為大家詳細(xì)介紹了golang根據(jù)URL獲取文件名,文中的示例代碼講解詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Golang二進(jìn)制反匯編問題

    Golang二進(jìn)制反匯編問題

    這篇文章主要介紹了Golang二進(jìn)制反匯編問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Go語言映射內(nèi)部實現(xiàn)及基礎(chǔ)功能實戰(zhàn)

    Go語言映射內(nèi)部實現(xiàn)及基礎(chǔ)功能實戰(zhàn)

    這篇文章主要為大家介紹了Go語言映射的內(nèi)部實現(xiàn)和基礎(chǔ)功能實戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-03-03
  • Go?Gin框架優(yōu)雅重啟和停止實現(xiàn)方法示例

    Go?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)行排序

    詳解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-12
  • Golang實現(xiàn)多存儲驅(qū)動設(shè)計SDK案例

    Golang實現(xiàn)多存儲驅(qū)動設(shè)計SDK案例

    這篇文章主要介紹了Golang實現(xiàn)多存儲驅(qū)動設(shè)計SDK案例,Gocache是一個基于Go語言編寫的多存儲驅(qū)動的緩存擴(kuò)展組件,更多具體內(nèi)容感興趣的小伙伴可以參考一下
    2022-09-09

最新評論