tools.go_stun
tools.go_stun/main.go
+ Добавляем логирование в отдельной горутине, чтобы снизить влияние процесса логирования на время обработки запросов
1.1 --- a/main.go Mon Apr 06 00:50:48 2020 +0300 1.2 +++ b/main.go Sat Apr 25 18:12:41 2020 +0300 1.3 @@ -14,6 +14,63 @@ 1.4 LOG_IDENT string = "net-a0fs-gostun" 1.5 ) 1.6 1.7 +const ( 1.8 + LOGP_INFO = iota 1.9 + LOGP_WARN 1.10 + LOGP_ERR 1.11 +) 1.12 + 1.13 +type logMessage struct { 1.14 + prio uint 1.15 + msg string 1.16 +} 1.17 + 1.18 +var log_chan = make(chan logMessage, 100) 1.19 + 1.20 +func log_handler() { 1.21 + var err error 1.22 + 1.23 + log, err := syslog.New(syslog.LOG_USER, LOG_IDENT) 1.24 + if err != nil { 1.25 + panic(err) 1.26 + } 1.27 + 1.28 + for log_msg := range log_chan { 1.29 + switch log_msg.prio { 1.30 + case LOGP_INFO: 1.31 + err = log.Info(log_msg.msg) 1.32 + case LOGP_WARN: 1.33 + err = log.Warning(log_msg.msg) 1.34 + case LOGP_ERR: 1.35 + err = log.Err(log_msg.msg) 1.36 + default: 1.37 + err = log.Err(fmt.Sprintf("Unknown type of log priority: %v", log_msg.prio)) 1.38 + } 1.39 + 1.40 + if err != nil { 1.41 + panic(err) 1.42 + } 1.43 + } 1.44 +} 1.45 + 1.46 +func log_info(msg string, vars ...interface{}) { 1.47 + log_chan <- logMessage{ 1.48 + prio: LOGP_INFO, 1.49 + msg: fmt.Sprintf(msg, vars...)} 1.50 +} 1.51 + 1.52 +func log_warn(msg string, vars ...interface{}) { 1.53 + log_chan <- logMessage{ 1.54 + prio: LOGP_WARN, 1.55 + msg: fmt.Sprintf(msg, vars...)} 1.56 +} 1.57 + 1.58 +func log_err(msg string, vars ...interface{}) { 1.59 + log_chan <- logMessage{ 1.60 + prio: LOGP_ERR, 1.61 + msg: fmt.Sprintf(msg, vars...)} 1.62 +} 1.63 + 1.64 func getPort() (res string, err error) { 1.65 if len(os.Args) < 2 { 1.66 err = errors.New("No port specify") 1.67 @@ -34,11 +91,6 @@ 1.68 } 1.69 1.70 func handler(conn net.Conn) { 1.71 - log, err := syslog.New(syslog.LOG_USER, LOG_IDENT) 1.72 - if err != nil { 1.73 - panic(err) 1.74 - } 1.75 - 1.76 _s_tm := time.Now() 1.77 remoteAddr := conn.RemoteAddr().String() 1.78 1.79 @@ -46,21 +98,15 @@ 1.80 var err error 1.81 _s_tmd := time.Now().Sub(_s_tm) 1.82 if r_err := recover(); r_err != nil { 1.83 - err = log.Err(fmt.Sprintf("Error on service for %s (service time: %v): %v", remoteAddr, _s_tmd, r_err)) 1.84 - if err != nil { 1.85 - panic(err.Error()) 1.86 - } 1.87 + log_err("Error on service for %s (service time: %v): %v", remoteAddr, _s_tmd, r_err) 1.88 } else { 1.89 err = conn.Close() 1.90 if err != nil { 1.91 - err = log.Err(fmt.Sprintf("Error on closing socket when service %s (service time: %v): %v", 1.92 - remoteAddr, _s_tmd, err)) 1.93 + log_err("Error on closing socket when service %s (service time: %v): %v", 1.94 + remoteAddr, _s_tmd, err) 1.95 1.96 - if err != nil { 1.97 - panic(err.Error()) 1.98 - } 1.99 } else { 1.100 - _ = log.Info(fmt.Sprintf("Ok service %s in %v", remoteAddr, _s_tmd)) 1.101 + log_info("Ok service %s in %v", remoteAddr, _s_tmd) 1.102 } 1.103 } 1.104 }() 1.105 @@ -72,7 +118,7 @@ 1.106 var dns string 1.107 dns_names, err := net.LookupAddr(strings.Trim(addr, "[] ")) 1.108 if err != nil { 1.109 - log.Warning(fmt.Sprintf("Fail to resolve dns name for %s: %v", remoteAddr, err)) 1.110 + log_warn("Fail to resolve dns name for %s: %v", remoteAddr, err) 1.111 } else { 1.112 for _, dns_name := range dns_names { 1.113 dns += "Name: " + dns_name + "\n" 1.114 @@ -98,6 +144,8 @@ 1.115 fail(1, fmt.Sprint("Error in parsing port number: ", err)) 1.116 } 1.117 1.118 + go log_handler() 1.119 + 1.120 svc, err := net.Listen("tcp", port) 1.121 if err != nil { 1.122 fail(2, fmt.Sprint("Fail to open socket: ", err))