<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
紀錄檔收集專案的準備中,本文主要講的是利用golang的tail
庫,監聽紀錄檔檔案的變動,將紀錄檔資訊傳送到kafka中。
go-ini
,sarama
,tail
其中:
go-ini
:用於讀取組態檔,統一管理設定項,有利於後其的維護sarama
:是一個go操作kafka的使用者端。目前我用於向kefka傳送訊息tail
:類似於linux的tail命令了,讀取檔案的後幾行。如果檔案有追加資料,會檢測到。就是通過它來監聽紀錄檔檔案視覺化工具:
offsetexplorer
:是kafka的視覺化工具,這裡用來檢視訊息是否投遞成功
sarama
和kafka
。tail
不斷去監聽紀錄檔檔案的變化。tail
傳送訊息,兩者通過一個管道通訊。一旦主協程接收到新紀錄檔,組裝格式,然後傳送到kafka中環境的話,確保zookeeper
和kafka
正常執行。因為還沒有使用sarama
讀取資料,使用offsetexplorer
來檢視任務是否真的投遞成功了。
serve來存放寫tail
服務類和sarama
服務類,conf存放ini組態檔
main函數為程式入口
main函數做的有:構建設定結構體,對映組態檔。呼叫和初始化tail
,srama
服務。
package main import ( "fmt" "sarama/serve" "github.com/go-ini/ini" ) type KafkaConfig struct { Address string `ini:"address"` ChannelSize int `ini:"chan_size"` } type TailConfig struct { Path string `ini:"path"` Filename string `ini:"fileName"` // 如果是結構體,則指明分割區名 Children `ini:"tailfile.children"` } type Config struct { KafkaConfig `ini:"kafka"` TailConfig `ini:"tailfile"` } type Children struct { Name string `ini:"name"` } func main() { // 載入設定 var cfg = new(Config) err := ini.MapTo(cfg, "./conf/go-conf.ini") if err != nil { fmt.Print(err) } // 初始化kafka ks := &serve.KafukaServe{} // 啟動kafka訊息監聽。非同步 ks.InitKafka([]string{cfg.KafkaConfig.Address}, int64(cfg.KafkaConfig.ChannelSize)) // 關閉主協程時,關閉channel defer ks.Destruct() // 初始化tail ts := &serve.TailServe{} ts.TailInit(cfg.TailConfig.Path + "/" + cfg.TailConfig.Filename) // 阻塞 ts.Listener(ks.MsgChan) }
有3個方法 :
InitKafka
,組裝設定項以及初始化接收訊息的管道,Listener
,監聽管道訊息,收到訊息後,將訊息組裝,傳送到kafkaDestruct
, 關閉管道package serve import ( "fmt" "github.com/Shopify/sarama" ) type KafukaServe struct { MsgChan chan string //err error } func (ks *KafukaServe) InitKafka(addr []string, chanSize int64) { // 讀取設定 config := sarama.NewConfig() // 1. 初始化生產者設定 config.Producer.RequiredAcks = sarama.WaitForAll // 選擇分割區 config.Producer.Partitioner = sarama.NewRandomPartitioner // 成功交付的資訊 config.Producer.Return.Successes = true ks.MsgChan = make(chan string, chanSize) go ks.Listener(addr, chanSize, config) } func (ks *KafukaServe) Listener(addr []string, chanSize int64, config *sarama.Config) { // 連線kafka var kafkaClient, _ = sarama.NewSyncProducer(addr, config) defer kafkaClient.Close() for { select { case content := <-ks.MsgChan: // msg := &sarama.ProducerMessage{ Topic: "weblog", Value: sarama.StringEncoder(content), } partition, offset, err := kafkaClient.SendMessage(msg) if err != nil { fmt.Println(err) } fmt.Println("分割區,偏移量:") fmt.Println(partition, offset) fmt.Println("___") } } } func (ks *KafukaServe) Destruct() { close(ks.MsgChan) }
主要包括了兩個方法:
TailInit
初始化,組裝tail
設定。Listener
Listener
,儲存kafka
服務類初始化之後的管道。監聽紀錄檔檔案,如果有新紀錄檔,就往管道里傳送package serve import ( "fmt" "github.com/hpcloud/tail" ) type TailServe struct { tails *tail.Tail } func (ts *TailServe) TailInit(filenName string) { config := tail.Config{ ReOpen: true, Follow: true, Location: &tail.SeekInfo{Offset: 0, Whence: 2}, MustExist: false, Poll: true, } // 開啟檔案開始讀取資料 ts.tails, _ = tail.TailFile(filenName, config) // if err != nil { // fmt.Println("tails %s failed,err:%vn", filenName, err) // return nil, err // } fmt.Println("啟動," + filenName + "監聽") } func (ts *TailServe) Listener(MsgChan chan string) { for { msg, ok := <-ts.tails.Lines if !ok { // todo fmt.Println("資料接收失敗") return } fmt.Println(msg.Text) MsgChan <- msg.Text } } // 測試案例 func Demo() { filename := `E:xx.log` config := tail.Config{ ReOpen: true, Follow: true, Location: &tail.SeekInfo{Offset: 0, Whence: 2}, MustExist: false, Poll: true, } // 開啟檔案開始讀取資料 tails, err := tail.TailFile(filename, config) if err != nil { fmt.Println("tails %s failed,err:%vn", filename, err) return } var ( msg *tail.Line ok bool ) fmt.Println("啟動") for { msg, ok = <-tails.Lines if !ok { fmt.Println("tails file close reopen,filename:$sn", tails.Filename) } fmt.Println("msg:", msg.Text) } }
到此這篇關於Golang監聽紀錄檔檔案並行送到kafka中的文章就介紹到這了,更多相關Golang 監聽紀錄檔檔案 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45