2018-12-03 04:39:13 +08:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Copyright (C) Microsoft. All rights reserved.
|
|
|
|
// Licensed under the MIT license.
|
|
|
|
// See LICENSE.txt file in the project root for full license information.
|
|
|
|
//-----------------------------------------------------------------------------
|
2020-06-19 01:07:05 +08:00
|
|
|
package main
|
2018-12-03 04:39:13 +08:00
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"os"
|
|
|
|
"time"
|
2020-06-19 01:07:05 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
// LogLevel specifies the logging level to use in both screen and
|
|
|
|
// file-based logging
|
|
|
|
type LogLevel int
|
2019-10-08 05:24:01 +08:00
|
|
|
|
2020-06-19 01:07:05 +08:00
|
|
|
const (
|
|
|
|
LogLevelInfo LogLevel = iota
|
|
|
|
LogLevelDebug
|
2018-12-03 04:39:13 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
type logMessage struct {
|
2019-01-21 01:13:47 +08:00
|
|
|
Time string
|
2018-12-03 04:39:13 +08:00
|
|
|
Type string
|
|
|
|
Message string
|
|
|
|
}
|
|
|
|
|
|
|
|
type logLatencyData struct {
|
|
|
|
Time string
|
|
|
|
Type string
|
|
|
|
RemoteAddr string
|
|
|
|
Protocol string
|
|
|
|
Avg string
|
|
|
|
Min string
|
|
|
|
P50 string
|
|
|
|
P90 string
|
|
|
|
P95 string
|
|
|
|
P99 string
|
|
|
|
P999 string
|
|
|
|
P9999 string
|
|
|
|
Max string
|
|
|
|
}
|
|
|
|
|
|
|
|
type logTestResults struct {
|
2019-01-21 01:13:47 +08:00
|
|
|
Time string
|
2018-12-03 04:39:13 +08:00
|
|
|
Type string
|
|
|
|
RemoteAddr string
|
|
|
|
Protocol string
|
|
|
|
BitsPerSecond string
|
|
|
|
ConnectionsPerSecond string
|
|
|
|
PacketsPerSecond string
|
|
|
|
AverageLatency string
|
|
|
|
}
|
|
|
|
|
|
|
|
var loggingActive = false
|
|
|
|
var logChan = make(chan string, 64)
|
|
|
|
|
2020-06-19 01:07:05 +08:00
|
|
|
func logInit(fileName string) {
|
2018-12-03 04:39:13 +08:00
|
|
|
if fileName == "" {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
logFile, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("Unable to open the log file %s, Error: %v", fileName, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
log.SetFlags(0)
|
|
|
|
log.SetOutput(logFile)
|
|
|
|
loggingActive = true
|
|
|
|
go runLogger(logFile)
|
|
|
|
}
|
|
|
|
|
2020-06-19 01:07:05 +08:00
|
|
|
func logFini() {
|
2018-12-03 04:39:13 +08:00
|
|
|
loggingActive = false
|
|
|
|
}
|
|
|
|
|
|
|
|
func runLogger(logFile *os.File) {
|
|
|
|
for loggingActive {
|
|
|
|
s := <-logChan
|
|
|
|
log.Println(s)
|
|
|
|
}
|
|
|
|
logFile.Close()
|
|
|
|
}
|
|
|
|
|
2019-10-08 05:24:01 +08:00
|
|
|
func logMsg(prefix, msg string) {
|
2018-12-03 04:39:13 +08:00
|
|
|
if loggingActive {
|
|
|
|
logData := logMessage{}
|
2019-01-21 01:13:47 +08:00
|
|
|
logData.Time = time.Now().UTC().Format(time.RFC3339)
|
2018-12-03 04:39:13 +08:00
|
|
|
logData.Type = prefix
|
|
|
|
logData.Message = msg
|
2018-12-11 23:28:33 +08:00
|
|
|
logJSON, _ := json.Marshal(logData)
|
|
|
|
logChan <- string(logJSON)
|
2018-12-03 04:39:13 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-19 01:07:05 +08:00
|
|
|
func logInfo(msg string) {
|
2019-10-08 05:24:01 +08:00
|
|
|
logMsg("INFO", msg)
|
2018-12-03 04:39:13 +08:00
|
|
|
}
|
|
|
|
|
2020-06-19 01:07:05 +08:00
|
|
|
func logError(msg string) {
|
2019-10-08 05:24:01 +08:00
|
|
|
logMsg("ERROR", msg)
|
2018-12-03 04:39:13 +08:00
|
|
|
}
|
|
|
|
|
2020-06-19 01:07:05 +08:00
|
|
|
func logDebug(msg string) {
|
2019-10-08 05:24:01 +08:00
|
|
|
logMsg("DEBUG", msg)
|
2018-12-03 04:39:13 +08:00
|
|
|
}
|
|
|
|
|
2020-06-19 01:07:05 +08:00
|
|
|
func logResults(s []string) {
|
2018-12-03 04:39:13 +08:00
|
|
|
if loggingActive {
|
|
|
|
logData := logTestResults{}
|
2019-01-21 01:13:47 +08:00
|
|
|
logData.Time = time.Now().UTC().Format(time.RFC3339)
|
2018-12-03 04:39:13 +08:00
|
|
|
logData.Type = "TestResult"
|
|
|
|
logData.RemoteAddr = s[0]
|
|
|
|
logData.Protocol = s[1]
|
|
|
|
logData.BitsPerSecond = s[2]
|
|
|
|
logData.ConnectionsPerSecond = s[3]
|
|
|
|
logData.PacketsPerSecond = s[4]
|
|
|
|
logData.AverageLatency = s[5]
|
2018-12-11 23:28:33 +08:00
|
|
|
logJSON, _ := json.Marshal(logData)
|
|
|
|
logChan <- string(logJSON)
|
2018-12-03 04:39:13 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-24 10:55:20 +08:00
|
|
|
func logLatency(remoteIP, proto string, avg, min, p50, p90, p95, p99, p999, p9999, max time.Duration) {
|
2018-12-03 04:39:13 +08:00
|
|
|
if loggingActive {
|
|
|
|
logData := logLatencyData{}
|
|
|
|
logData.Time = time.Now().UTC().Format(time.RFC3339)
|
|
|
|
logData.Type = "LatencyResult"
|
2020-11-24 10:55:20 +08:00
|
|
|
logData.RemoteAddr = remoteIP
|
2018-12-03 04:39:13 +08:00
|
|
|
logData.Protocol = proto
|
2020-06-19 01:07:05 +08:00
|
|
|
logData.Avg = durationToString(avg)
|
|
|
|
logData.Min = durationToString(min)
|
|
|
|
logData.P50 = durationToString(p50)
|
|
|
|
logData.P90 = durationToString(p90)
|
|
|
|
logData.P95 = durationToString(p95)
|
|
|
|
logData.P99 = durationToString(p99)
|
|
|
|
logData.P999 = durationToString(p999)
|
|
|
|
logData.P9999 = durationToString(p9999)
|
|
|
|
logData.Max = durationToString(max)
|
2018-12-11 23:28:33 +08:00
|
|
|
logJSON, _ := json.Marshal(logData)
|
|
|
|
logChan <- string(logJSON)
|
2018-12-03 04:39:13 +08:00
|
|
|
}
|
|
|
|
}
|