@@ -9,13 +9,17 @@ import (
9
9
"sort"
10
10
"time"
11
11
12
+ "github.com/araddon/dateparse"
12
13
"github.com/getsentry/sentry-go"
13
14
"github.com/hpcloud/tail"
14
15
"github.com/vjeantet/grok"
15
16
"gopkg.in/alecthomas/kingpin.v2"
16
17
)
17
18
18
- func printMap (m map [string ]string ) {
19
+ const MessageField = "message"
20
+ const TimeStampField = "timestamp"
21
+
22
+ func PrintMap (m map [string ]string ) {
19
23
keys := make ([]string , 0 , len (m ))
20
24
for k := range m {
21
25
keys = append (keys , k )
@@ -24,8 +28,8 @@ func printMap(m map[string]string) {
24
28
25
29
for _ , k := range keys {
26
30
fmt .Printf ("%+15s: %s\n " , k , m [k ])
27
-
28
31
}
32
+ fmt .Println ()
29
33
}
30
34
31
35
func IsDryRun () bool {
@@ -45,12 +49,12 @@ func InitSentry() {
45
49
err := sentry .Init (sentry.ClientOptions {})
46
50
47
51
if err != nil {
48
- log .Fatal ("Sentry initialization failed: %v\n " , err )
52
+ log .Fatalf ("Sentry initialization failed: %v\n " , err )
49
53
}
50
54
}
51
55
52
56
func CaptureEvent (line string , values map [string ]string ) {
53
- message := values ["err_message" ]
57
+ message := values [MessageField ]
54
58
if message == "" {
55
59
message = line
56
60
}
@@ -75,6 +79,20 @@ func CaptureEvent(line string, values map[string]string) {
75
79
})
76
80
}
77
81
82
+ func ParseTimestamp (str string ) int64 {
83
+ fallback := int64 (0 )
84
+ if str == "" {
85
+ return fallback
86
+ }
87
+
88
+ time , err := dateparse .ParseLocal (str )
89
+ if err != nil {
90
+ return fallback
91
+ }
92
+
93
+ return time .Unix ()
94
+ }
95
+
78
96
func ProcessLine (line string , pattern string , g * grok.Grok ) {
79
97
values , err := g .Parse (pattern , line )
80
98
if err != nil {
@@ -83,10 +101,14 @@ func ProcessLine(line string, pattern string, g *grok.Grok) {
83
101
}
84
102
85
103
if ! IsDryRun () {
104
+ // Attempt to parse the timestamp
105
+ timestamp := ParseTimestamp (values [TimeStampField ])
106
+
86
107
// Original log line
87
108
sentry .AddBreadcrumb (& sentry.Breadcrumb {
88
- Message : line ,
89
- Level : sentry .LevelInfo ,
109
+ Message : line ,
110
+ Level : sentry .LevelInfo ,
111
+ Timestamp : timestamp ,
90
112
})
91
113
}
92
114
@@ -96,8 +118,8 @@ func ProcessLine(line string, pattern string, g *grok.Grok) {
96
118
97
119
CaptureEvent (line , values )
98
120
99
- log .Println (">>> Entry:" )
100
- printMap (values )
121
+ log .Println ("Entry found :" )
122
+ PrintMap (values )
101
123
}
102
124
103
125
func InitGrokProcessor () * grok.Grok {
@@ -157,14 +179,16 @@ func ProcessFile(filename string, pattern string) {
157
179
}
158
180
}
159
181
160
- t , err := tail .TailFile (
182
+ follow := ! * noFollow
183
+ tailFile , err := tail .TailFile (
161
184
filename ,
162
185
tail.Config {
163
- Follow : ! * noFollow ,
186
+ Follow : follow ,
164
187
Location : & seekInfo ,
188
+ ReOpen : follow ,
165
189
})
166
190
167
- for line := range t .Lines {
191
+ for line := range tailFile .Lines {
168
192
ProcessLine (line .Text , pattern , g )
169
193
170
194
}
0 commit comments