github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/app/logevents/subscriber.go (about) 1 package logevents 2 3 import ( 4 "fmt" 5 "github.com/fibonacci-chain/fbc/libs/system" 6 "os" 7 "time" 8 ) 9 10 type Subscriber interface { 11 Init(urls string, logdir string) 12 Run() 13 } 14 15 func NewSubscriber() Subscriber { 16 return &subscriber{ 17 fileMap: make(map[string]*os.File), 18 } 19 } 20 21 type subscriber struct { 22 fileMap map[string]*os.File 23 kafka *logClient 24 logdir string 25 } 26 27 func (s *subscriber) Init(urls string, logdir string) { 28 s.kafka = newLogClient(urls, HeartbeatTopic, FBCLogTopic, LogConsumerGroup) 29 s.logdir = logdir 30 31 _, err := os.Stat(logdir) 32 if os.IsNotExist(err) { 33 err = os.Mkdir(logdir, os.ModePerm) 34 } 35 if err != nil { 36 panic(err) 37 } 38 } 39 40 func (s *subscriber) heartbeatRoutine() { 41 ticker := time.NewTicker(HeartbeatInterval) 42 pid := system.Getpid() 43 id := 0 44 for range ticker.C { 45 key := fmt.Sprintf("%d:%d", pid, id) 46 msg := &KafkaMsg{ 47 Data: "heartbeat", 48 } 49 err := s.kafka.send(key, msg) 50 if err != nil { 51 fmt.Printf("Subscriber heartbeat routine. %s, err: %s\n", key, err) 52 continue 53 } 54 id++ 55 fmt.Printf("Subscriber heartbeat routine. Send: %s\n", key) 56 } 57 } 58 59 func (s *subscriber) Run() { 60 go s.heartbeatRoutine() 61 for { 62 key, m, err := s.kafka.recv() 63 if err != nil { 64 fmt.Printf("recv err: %s", err) 65 continue 66 } 67 fmt.Printf("recv msg from %s, at topic: %v\n", key, m.Topic) 68 err = s.onEvent(key, m.Data) 69 if err != nil { 70 fmt.Printf("onEvent err: %s", err) 71 } 72 } 73 } 74 75 func (s *subscriber) onEvent(from, event string) (err error) { 76 from = s.logdir + string(os.PathSeparator) + from + ".log" 77 78 var f *os.File 79 f, err = s.getOsFile(from) 80 if err != nil { 81 return 82 } 83 84 _, err = f.WriteString(event) 85 return 86 } 87 88 func (s *subscriber) getOsFile(fileName string) (file *os.File, err error) { 89 var ok bool 90 file, ok = s.fileMap[fileName] 91 92 if ok { 93 return 94 } 95 96 file, err = os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, os.ModePerm) 97 if err == nil { 98 s.fileMap[fileName] = file 99 } 100 return 101 }