package main import ( "fmt" "os" "os/signal" "syscall" "time" "github.com/go-redis/redis/v8" log "github.com/sirupsen/logrus" ) // Производит некоторую инициализацию перед запуском main() func init() { log.SetFormatter(&log.TextFormatter{ DisableQuote: true, DisableLevelTruncation: false, DisableColors: true, FullTimestamp: true, TimestampFormat: "2006-01-02 15:04:05", }) readConfig() // no panic, no trace switch config.Loglevel { case "fatal": log.SetLevel(log.FatalLevel) case "error": log.SetLevel(log.ErrorLevel) case "warn": log.SetLevel(log.WarnLevel) case "info": log.SetLevel(log.InfoLevel) case "debug": log.SetLevel(log.DebugLevel) default: log.SetLevel(log.InfoLevel) } // Иницализируем клиента Редиски redisClient = redis.NewClient(&redis.Options{ Addr: fmt.Sprintf("%s:%d", config.Server, config.Port), }).WithContext(ctx).WithTimeout(time.Duration(config.Timeout) * time.Second) // Обозначим, что хотим после соединения подписаться на события из канала config.Channel subscriber = redisClient.Subscribe(ctx, config.Channel) } // Основная функция программы, не добавить и не убавить func main() { // Откроем лог и скормим его логгеру if config.Log != "" { logfile, err := os.OpenFile(config.Log, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) if err != nil { log.Fatalf("Unable to open log file %s: %s", config.Log, err) } log.SetOutput(logfile) } // Самое время поставить траппер сигналов signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) go sigHandler() // Начнём выгребать события из редиски (длина ковеера/буфера канала по-умолчанию - 100 сообщений) ch := subscriber.Channel() for msg := range ch { if !shutdown { msgParser(ctx, msg.Payload) } } } /* vim: set ft=go noet ai ts=4 sw=4 sts=4: */