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

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

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

簡(jiǎn)介

借助 github.com/hpcloud/tail ,可以實(shí)時(shí)追蹤文件變更,達(dá)到類似shell命令tail -f的效果。

示例代碼

以下示例代碼用于實(shí)時(shí)讀取nginx的access.log日志文件,讀取到后輸出到控制臺(tái)。如果nginx日志做了json格式化,還可以解析讀取到的內(nèi)容,對(duì)日志進(jìn)行更多處理,比如日志內(nèi)容寫(xiě)入數(shù)據(jù)庫(kù)、做日志告警等,對(duì)于訪問(wèn)量較小的系統(tǒng)來(lái)說(shuō),這樣就不需要消耗很多資源去搭建ELK、Loki等專門(mén)的日志監(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)
	}
	// 不從文件開(kāi)始讀, 而是從文件當(dāng)前末尾開(kāi)始讀
	// 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)
	}
}

知識(shí)補(bǔ)充

1.官方文檔

2.github.com/hpcloud/tail 使用介紹

地址:https://github.com/hpcloud/tail

linux中的tail命令用途是依照要求將指定的文件的最后部分輸出到標(biāo)準(zhǔn)設(shè)備,通常是終端,通俗講來(lái),就是把某個(gè)檔案文件的最后幾行顯示到終端上,假設(shè)該檔案有更新,tail會(huì)自己主動(dòng)刷新,確保你看到最新的檔案內(nèi)容。

這個(gè)包實(shí)現(xiàn)了類似的功能。

t, err := tail.TailFile("/var/log/nginx.log", tail.Config{Follow: true})
if err != nil {
    fmt.Println(err)  //如果文件不存在,會(huì)阻塞并打印Waiting for my.log to appear...,直到文件被創(chuàng)建
}
for line := range t.Lines {
    fmt.Println(line.Text)
}

tail.TailFile()函數(shù)開(kāi)啟goroutine去讀取文件,通過(guò)channel格式的t.lines傳遞內(nèi)容。

其他配置項(xiàng)

type Config struct {
    // File-specifc
    Location    *SeekInfo // 指定開(kāi)始讀取的位置
    ReOpen      bool      //true則文件被刪掉阻塞等待新建該文件,false則文件被刪掉時(shí)程序結(jié)束
    MustExist   bool      //true則沒(méi)有找到文件就報(bào)錯(cuò)并結(jié)束,false則沒(méi)有找到文件就阻塞保持住
    Poll        bool      // 使用Linux的Poll函數(shù),poll的作用是把當(dāng)前的文件指針掛到等待隊(duì)列
    Pipe        bool      // Is a named pipe (mkfifo)
    RateLimiter *ratelimiter.LeakyBucket
    // Generic IO
    Follow      bool //true則一直阻塞并監(jiān)聽(tīng)指定文件,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個(gè)字符開(kāi)始讀,偏移量大于一行內(nèi)容時(shí)換行繼續(xù)計(jì)算(換行符\n計(jì)算在內(nèi)占兩個(gè)字符,但是不打印出來(lái))
SEEK_SET int = 0 // 跳到文件的開(kāi)始位置
SEEK_CUR int = 1 // 跳到文件的當(dāng)前位置(好像和設(shè)置為開(kāi)始位置一樣)
SEEK_END int = 2 // 跳到文件最后,不讀取文件里原有的內(nèi)容,從新加入的開(kāi)始讀

t.Tell()返回當(dāng)前offset

到此這篇關(guān)于golang使用tail實(shí)現(xiàn)追蹤文件變更的文章就介紹到這了,更多相關(guān)golang tail內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語(yǔ)言通過(guò)odbc操作Access數(shù)據(jù)庫(kù)的方法

    go語(yǔ)言通過(guò)odbc操作Access數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了go語(yǔ)言通過(guò)odbc操作Access數(shù)據(jù)庫(kù)的方法,實(shí)例分析了Go語(yǔ)言通過(guò)odbc連接、查詢與關(guān)閉access數(shù)據(jù)庫(kù)的技巧,需要的朋友可以參考下
    2015-03-03
  • 一文詳解go mod依賴管理詳情

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

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

    Golang 1.16 中 Modules的主要變化更新

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

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

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

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

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

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

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

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

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

    Go?Gin框架優(yōu)雅重啟和停止實(shí)現(xiàn)方法示例

    Web應(yīng)用程序中,有時(shí)需要重啟或停止服務(wù)器,無(wú)論是因?yàn)楦麓a還是進(jìn)行例行維護(hù),這時(shí)需要保證應(yīng)用程序的可用性和數(shù)據(jù)的一致性,就需要優(yōu)雅地關(guān)閉和重啟應(yīng)用程序,即不丟失正在處理的請(qǐng)求和不拒絕新的請(qǐng)求,本文將詳解如何在Go語(yǔ)言中使用Gin這個(gè)框架實(shí)現(xiàn)優(yōu)雅的重啟停止
    2024-01-01
  • 詳解Go語(yǔ)言如何使用標(biāo)準(zhǔn)庫(kù)sort對(duì)切片進(jìn)行排序

    詳解Go語(yǔ)言如何使用標(biāo)準(zhǔn)庫(kù)sort對(duì)切片進(jìn)行排序

    Sort?標(biāo)準(zhǔn)庫(kù)提供了對(duì)基本數(shù)據(jù)類型的切片和自定義類型的切片進(jìn)行排序的函數(shù)。今天主要分享的內(nèi)容是使用?Go?標(biāo)準(zhǔn)庫(kù)?sort?對(duì)切片進(jìn)行排序,感興趣的可以了解一下
    2022-12-12
  • Golang實(shí)現(xiàn)多存儲(chǔ)驅(qū)動(dòng)設(shè)計(jì)SDK案例

    Golang實(shí)現(xiàn)多存儲(chǔ)驅(qū)動(dòng)設(shè)計(jì)SDK案例

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

最新評(píng)論