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  }