2024-08-01 00:45:07 +08:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2024-08-29 00:42:11 +08:00
|
|
|
"gopkg.in/ini.v1"
|
|
|
|
config "logagent/conf"
|
2024-09-02 00:26:06 +08:00
|
|
|
"logagent/etcd"
|
2024-08-01 00:45:07 +08:00
|
|
|
"logagent/kafka"
|
2024-09-09 08:54:56 +08:00
|
|
|
"logagent/taillog"
|
2024-09-10 20:46:31 +08:00
|
|
|
"logagent/utils"
|
|
|
|
"sync"
|
2024-08-29 00:42:11 +08:00
|
|
|
"time"
|
2024-08-01 00:45:07 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
//logagent的入口程序
|
|
|
|
|
2024-08-29 00:42:11 +08:00
|
|
|
var (
|
|
|
|
cfg = new(config.AppConfig)
|
|
|
|
)
|
|
|
|
|
2024-09-02 00:26:06 +08:00
|
|
|
//func run() {
|
|
|
|
// //1.读取日志
|
|
|
|
// for {
|
|
|
|
// select {
|
|
|
|
// case line := <-taillog.ReadChan():
|
|
|
|
// //2.发送给kafka
|
|
|
|
// kafka.SendToKafka(cfg.KafkaConf.Topic, line.Text)
|
|
|
|
// default:
|
|
|
|
// time.Sleep(time.Second)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//}
|
2024-08-01 00:45:07 +08:00
|
|
|
|
|
|
|
func main() {
|
2024-09-02 00:26:06 +08:00
|
|
|
//1.读取配置文件
|
2024-08-29 00:42:11 +08:00
|
|
|
err := ini.MapTo(cfg, "./conf/config.ini")
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("load ini err:", err)
|
|
|
|
}
|
2024-08-01 00:45:07 +08:00
|
|
|
//1.初始化kafka连接
|
2024-09-09 08:54:56 +08:00
|
|
|
err = kafka.Init([]string{cfg.KafkaConf.Address}, cfg.KafkaConf.ChanMaxSize)
|
2024-08-01 00:45:07 +08:00
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("init kafka failed,error:%v\n", err)
|
|
|
|
return
|
|
|
|
}
|
2024-08-29 00:42:11 +08:00
|
|
|
fmt.Println("init kafka success")
|
2024-09-02 00:26:06 +08:00
|
|
|
//2.初始化etcd
|
|
|
|
err = etcd.Init(cfg.EtcdConf.Address, time.Duration(cfg.EtcdConf.Timeout)*time.Second)
|
2024-08-01 00:45:07 +08:00
|
|
|
if err != nil {
|
2024-09-02 00:26:06 +08:00
|
|
|
fmt.Printf("init etcd failed,error:%v\n", err)
|
2024-08-01 00:45:07 +08:00
|
|
|
}
|
2024-09-03 00:13:58 +08:00
|
|
|
|
2024-09-10 20:46:31 +08:00
|
|
|
//为了实现每个logagent都拉取自己独有的配置。所以要以自己的ip地址作为区分
|
|
|
|
ipStr, err := utils.GetBoundIP()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
etcdConfKey := fmt.Sprintf(cfg.EtcdConf.Key, ipStr)
|
2024-09-03 00:13:58 +08:00
|
|
|
//1.从etcd中获取日志收集项的配置信息
|
2024-09-10 20:46:31 +08:00
|
|
|
logEntryConf, err := etcd.GetConf(etcdConfKey)
|
2024-09-03 00:13:58 +08:00
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("get etcd failed,error:%v\n", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
fmt.Printf("get conf from etcd success,logEntryConf:%#v\n", logEntryConf)
|
2024-09-10 20:46:31 +08:00
|
|
|
|
2024-09-09 08:54:56 +08:00
|
|
|
//派一个哨兵去监视etcd配置的变化
|
2024-09-10 20:46:31 +08:00
|
|
|
|
2024-09-03 00:13:58 +08:00
|
|
|
for k, v := range logEntryConf {
|
|
|
|
fmt.Printf("index:%v,value:%v\n", k, v)
|
|
|
|
}
|
2024-09-10 20:46:31 +08:00
|
|
|
|
2024-09-09 08:54:56 +08:00
|
|
|
//收集日志发送到kafka
|
2024-09-10 20:46:31 +08:00
|
|
|
taillog.Init(logEntryConf) //初始化通道在这个函数中
|
|
|
|
newConfChan := taillog.NewConfChan() //从taillog包中获取对外暴露的通道
|
|
|
|
var wg sync.WaitGroup
|
|
|
|
wg.Add(1)
|
|
|
|
go etcd.Watcher(etcdConfKey, newConfChan) //哨兵接受到最新的配置信息通知上面的通道
|
|
|
|
wg.Wait()
|
2024-09-02 00:26:06 +08:00
|
|
|
//2.打开日志文件准备收集日志
|
|
|
|
//err = taillog.Init(cfg.TailLog.FileName)
|
|
|
|
//if err != nil {
|
|
|
|
// fmt.Printf("taillog init failed,error:%v\n", err)
|
|
|
|
// return
|
|
|
|
//}
|
|
|
|
//fmt.Println("init taillog success")
|
|
|
|
//run()
|
2024-08-29 00:42:11 +08:00
|
|
|
|
2024-08-01 00:45:07 +08:00
|
|
|
}
|