@@ -9,13 +9,17 @@ import (
99 "sort"
1010 "time"
1111
12+ "github.com/araddon/dateparse"
1213 "github.com/getsentry/sentry-go"
1314 "github.com/hpcloud/tail"
1415 "github.com/vjeantet/grok"
1516 "gopkg.in/alecthomas/kingpin.v2"
1617)
1718
18- func printMap (m map [string ]string ) {
19+ const MessageField = "message"
20+ const TimeStampField = "timestamp"
21+
22+ func PrintMap (m map [string ]string ) {
1923 keys := make ([]string , 0 , len (m ))
2024 for k := range m {
2125 keys = append (keys , k )
@@ -24,8 +28,8 @@ func printMap(m map[string]string) {
2428
2529 for _ , k := range keys {
2630 fmt .Printf ("%+15s: %s\n " , k , m [k ])
27-
2831 }
32+ fmt .Println ()
2933}
3034
3135func IsDryRun () bool {
@@ -45,12 +49,12 @@ func InitSentry() {
4549 err := sentry .Init (sentry.ClientOptions {})
4650
4751 if err != nil {
48- log .Fatal ("Sentry initialization failed: %v\n " , err )
52+ log .Fatalf ("Sentry initialization failed: %v\n " , err )
4953 }
5054}
5155
5256func CaptureEvent (line string , values map [string ]string ) {
53- message := values ["err_message" ]
57+ message := values [MessageField ]
5458 if message == "" {
5559 message = line
5660 }
@@ -75,6 +79,20 @@ func CaptureEvent(line string, values map[string]string) {
7579 })
7680}
7781
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+
7896func ProcessLine (line string , pattern string , g * grok.Grok ) {
7997 values , err := g .Parse (pattern , line )
8098 if err != nil {
@@ -83,10 +101,14 @@ func ProcessLine(line string, pattern string, g *grok.Grok) {
83101 }
84102
85103 if ! IsDryRun () {
104+ // Attempt to parse the timestamp
105+ timestamp := ParseTimestamp (values [TimeStampField ])
106+
86107 // Original log line
87108 sentry .AddBreadcrumb (& sentry.Breadcrumb {
88- Message : line ,
89- Level : sentry .LevelInfo ,
109+ Message : line ,
110+ Level : sentry .LevelInfo ,
111+ Timestamp : timestamp ,
90112 })
91113 }
92114
@@ -96,8 +118,8 @@ func ProcessLine(line string, pattern string, g *grok.Grok) {
96118
97119 CaptureEvent (line , values )
98120
99- log .Println (">>> Entry:" )
100- printMap (values )
121+ log .Println ("Entry found :" )
122+ PrintMap (values )
101123}
102124
103125func InitGrokProcessor () * grok.Grok {
@@ -157,14 +179,16 @@ func ProcessFile(filename string, pattern string) {
157179 }
158180 }
159181
160- t , err := tail .TailFile (
182+ follow := ! * noFollow
183+ tailFile , err := tail .TailFile (
161184 filename ,
162185 tail.Config {
163- Follow : ! * noFollow ,
186+ Follow : follow ,
164187 Location : & seekInfo ,
188+ ReOpen : follow ,
165189 })
166190
167- for line := range t .Lines {
191+ for line := range tailFile .Lines {
168192 ProcessLine (line .Text , pattern , g )
169193
170194 }
0 commit comments