-
Notifications
You must be signed in to change notification settings - Fork 0
/
parselog.go
111 lines (103 loc) · 2.31 KB
/
parselog.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package springparse
import (
"bytes"
"crypto/md5"
"encoding/hex"
"encoding/json"
"fmt"
"strconv"
"strings"
"time"
)
type rawLog struct {
Log string `json:"log"`
Stream string `json:"stream"`
Time time.Time `json:"time"`
}
type parseLogOutput struct {
id string
content elasticOut
}
type parseLogInput struct {
rawLog []byte
fileName string
}
func (r *Runner) parseLog(s parseLogInput) (parseLogOutput, error) {
var p rawLog
var level, processId, thread, loggerName string
rawlogNoESC := bytes.Replace(s.rawLog, []byte("\n"), []byte(""), -1)
err := json.Unmarshal(rawlogNoESC, &p)
if err != nil {
return parseLogOutput{}, fmt.Errorf("Unable to marshall Json %v", err)
}
logSplit := strings.Split(p.Log, " ")
for _, word := range logSplit {
// Get level
if word == "INFO" || word == "DEBUG" || word == "ERROR" || word == "WARN" && level == "" {
level = word
}
/// Get process Id
_, err := strconv.Atoi(word)
if err == nil && processId == "" {
processId = word
}
}
thread = getThread(p.Log)
loggerName = getLoggerName(p.Log)
return parseLogOutput{
id: logHash(s.rawLog),
content: elasticOut{
TimeStamp: p.Time,
RawLog: p.Log,
Thread: thread,
LoggerName: loggerName,
ProcessId: processId,
FileName: s.fileName,
LogLevel: level,
},
}, nil
}
func getThread(s string) string {
var begin, end int
for idx, char := range s {
if string(char) == "[" && begin == 0 {
begin = idx + 1
}
if string(char) == "]" && end == 0 && begin != 0 {
end = idx
}
}
// Get thread
if end > begin {
return strings.Replace(s[begin:end], " ", "", -1)
}
return ""
}
func getLoggerName(s string) string {
var begin, end, loggerbegin, loggerend, spacecount int
for idx, char := range s {
if string(char) == "[" && begin == 0 {
begin = idx + 1
}
if string(char) == "]" && end == 0 && begin != 0 && loggerbegin == 0 {
end = idx
loggerbegin = idx + 1
}
if string(char) == " " && loggerbegin != 0 {
spacecount++
}
if spacecount == 2 && loggerend == 0 {
loggerend = idx
}
}
// Get thread
if loggerend > loggerbegin {
return strings.Replace(s[loggerbegin:loggerend], " ", "", -1)
}
return ""
}
func logHash(rawInput []byte) string {
hasher := md5.New()
hasher.Write(rawInput)
return hex.EncodeToString(hasher.Sum(nil))[0:20]
}