tools.go_stun

Yohn Y. 2020-04-25 Parent:6455d3067db1 Child:12d8f041fbdf

3:102fbdab34d8 Go to Latest

tools.go_stun/main.go

+ Добавляем логирование в отдельной горутине, чтобы снизить влияние процесса логирования на время обработки запросов

History
     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))