-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreader.go
114 lines (97 loc) · 2.33 KB
/
reader.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
112
113
114
// Copyright 2018 The OpenPitrix Authors. All rights reserved.
// Use of this source code is governed by a Apache license
// that can be found in the LICENSE file.
package logger
import (
"fmt"
"strconv"
"strings"
"time"
)
type logMessage struct {
Time time.Time
RequestId string
MessageId []string
Level string
Text string
File string
Line int
}
func readLogs(logs string) []logMessage {
const (
timeLayout = "2006-01-02 15:04:05.99999"
minLogLen = len(timeLayout + " " + "-INFO-")
)
var (
results []logMessage
)
for _, s := range strings.Split(logs, "\n") {
s = strings.TrimSpace(s)
if len(s) < minLogLen {
continue
}
// 1. parse time
when, err := time.Parse(timeLayout, strings.TrimSpace(s[:len(timeLayout)]))
if err != nil {
continue
}
// skip time
s = s[len(timeLayout):]
// 2. parse level
var level string
fmt.Sscanf(s, "%s", &level)
if level == "" {
continue
}
// skip level
if len(s) > len(level) {
s = s[len(level)+1:]
} else {
s = s[len(level):]
}
// fix level
level = strings.Trim(level, "-")
// 3. parse (file:line)
filenameStartPos := strings.LastIndex(s, "(")
lineStartPos := strings.LastIndex(s, ":")
lineEndPos := strings.LastIndex(s, ")")
var filename string
var fileline int
if filenameStartPos >= 0 && lineStartPos > (filenameStartPos+1) {
filename = s[filenameStartPos+1 : lineStartPos]
}
if lineStartPos >= 0 && lineEndPos > (lineStartPos+1) {
fileline, _ = strconv.Atoi(s[lineStartPos+1 : lineEndPos])
}
// 4. parse {msg-id|...@req-id}
msgIdStartPos := strings.LastIndex(s, "{")
reqIdStartPos := strings.LastIndex(s, "@")
reqIdEndPos := strings.LastIndex(s, "}")
var msgId []string
var reqId string
if msgIdStartPos >= 0 && reqIdStartPos > (msgIdStartPos+1) {
msgId = strings.Split(s[msgIdStartPos+1:reqIdStartPos], "|")
}
if reqIdStartPos < reqIdEndPos {
reqId = s[reqIdStartPos+1 : reqIdEndPos]
}
// 5. parse text
var text string
if filename != "" {
text = strings.TrimSpace(s[:filenameStartPos])
} else {
text = strings.TrimSpace(s)
}
// OK
results = append(results, logMessage{
Time: when,
RequestId: reqId,
MessageId: msgId,
Level: strings.Trim(level, "-"),
Text: text,
File: filename,
Line: fileline,
})
}
return results
}