共计 1539 个字符,预计需要花费 4 分钟才能阅读完成。
我的项目架构设计
LogAgent 的工作流程:
- 读日志 —
tailf
第三方库
func main() {
fileName := "./my.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("tail file failed, err:", err)
return
}
var (
line *tail.Line
ok bool
)
for {
line, ok = <-tails.Lines
if !ok {fmt.Printf("tail file close reopen, filename:%s\n", tails.Filename)
time.Sleep(time.Second)
continue
}
fmt.Println("line:", line.Text)
}}
2. 往 kafka 写日志 —sarama
第三方库
sarama v1.20 之后的版本加⼊了 zstd 压缩算法,须要⽤到 cgo,在 Windows 平台编译时会提醒相似如
下谬误:# github.com/DataDog/zstd
exec: "gcc":executable file not found in %PATH%
所以在 Windows 平台请使⽤ v1.19 版本的 sarama。
// 基于 sarama 第三⽅库开发的 kafka client
func main() {config := sarama.NewConfig()
// tailf 包使⽤
config.Producer.RequiredAcks = sarama.WaitForAll // 发送完数据须要 leader 和 follow 都确认
config.Producer.Partitioner = sarama.NewRandomPartitioner // 新选出⼀个 partition
config.Producer.Return.Successes = true // 胜利交付的音讯将在 success channel 返回
// 结构⼀个音讯
msg := &sarama.ProducerMessage{}
msg.Topic = "web_log"
msg.Value = sarama.StringEncoder("this is a test log")
// 连贯 kafka
client, err := sarama.NewSyncProducer([]string{"127.0.0.1:9092"}, config)
if err != nil {fmt.Println("producer closed, err:", err)
return
}
fmt.Println("连贯 kafka 胜利!")
defer client.Close()
// 发送音讯
pid, offset, err := client.SendMessage(msg)
fmt.Println("xxx")
if err != nil {fmt.Println("send msg failed, err:", err)
return
}
fmt.Printf("pid:%v offset:%v\n", pid, offset)
fmt.Println("发送胜利!")}
kafka 和 zookeeper
tail 介绍
gopkg.in/ini.v1 第三方文档
https://ini.unknwon.io/docs/a…
https://pkg.go.dev/gopkg.in/i…
实例代码
LogAgent 的工作流程
正文完