golang LogAgent 项目实战(三)

本文主要记录了学习golang时做的一个项目:日志收集项目。

关键词:日志收集项目

架构图

LogAgent工作流程

读日志(tailf第三方库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
func main() {
fileName := "./my.log"
config := tail.Config{
ReOpen: true, // 重新打开重新创建的文件(失败了会尝试重新读取)
Follow: true, // 继续寻找新行 (tail -f)
Location: &tail.SeekInfo{Offset: 0, Whence: 2}, // 从哪个地方开始读取
MustExist: false, // 日志文件是否必须存在
Poll: true, // 轮询文件更改而不是使用inotify
}
tails, err := tail.TailFile(fileName, config)
if err != nil {
fmt.Printf("tail file failed, err: %v", err)
return
}
var (
line *tail.Line
ok bool
)
for {
line, ok = <-tails.Lines
if !ok {
fmt.Printf("tail file close reopen, finename :%s\n", tails.Filename)
time.Sleep(time.Second)
continue
}
fmt.Println("line: ", line.Text)
}
}

往Kafka里写日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 基于sarama第三方库开发kafka client
func main() {

config := sarama.NewConfig()
// tailf包使用
config.Producer.RequiredAcks = sarama.WaitForAll //发送完数据需要等待follow回复ack
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{"192.168.31.103:9092"}, config)
if err != nil {
fmt.Println("producer closed, err :", err)
return
}
defer client.Close()
// 发送消息
pid, offset, err := client.SendMessage(msg)
if err != nil {
fmt.Println("send msg failed, err:", err)
return
}
fmt.Printf("pid: %v, offset: %v\n", pid, offset)
}

Kafka和zookeeper

tail介绍

第一版程序

第一版代码

设计包的入口函数时,要考虑上面的设计模式。

第二版程序

第二版代码

读取配置文件版本的logAgent

go-ini库的使用

go-ini