diff --git a/plugins/inputs/logparser/grok/grok_test.go b/plugins/inputs/logparser/grok/grok_test.go index 1344896b84c40..4e0ead6e9a67d 100644 --- a/plugins/inputs/logparser/grok/grok_test.go +++ b/plugins/inputs/logparser/grok/grok_test.go @@ -57,6 +57,43 @@ func Benchmark_ParseLine_CustomPattern(b *testing.B) { benchM = m } +// Test a very simple parse pattern. +func TestSimpleParse(t *testing.T) { + p := &Parser{ + Patterns: []string{"%{TESTLOG}"}, + CustomPatterns: ` + TESTLOG %{NUMBER:num:int} %{WORD:client} + `, + } + assert.NoError(t, p.Compile()) + + m, err := p.ParseLine(`142 bot`) + assert.NoError(t, err) + require.NotNil(t, m) + + assert.Equal(t, + map[string]interface{}{ + "num": int64(142), + "client": "bot", + }, + m.Fields()) +} + +// Verify that patterns with a regex lookahead fail at compile time. +func TestParsePatternsWithLookahead(t *testing.T) { + p := &Parser{ + Patterns: []string{"%{MYLOG}"}, + CustomPatterns: ` + NOBOT ((?!bot|crawl).)* + MYLOG %{NUMBER:num:int} %{NOBOT:client} + `, + } + assert.NoError(t, p.Compile()) + + _, err := p.ParseLine(`1466004605359052000 bot`) + assert.Error(t, err) +} + func TestMeasurementName(t *testing.T) { p := &Parser{ Measurement: "my_web_log", diff --git a/plugins/inputs/logparser/logparser.go b/plugins/inputs/logparser/logparser.go index 8ec32835829a1..a228322772c13 100644 --- a/plugins/inputs/logparser/logparser.go +++ b/plugins/inputs/logparser/logparser.go @@ -226,6 +226,8 @@ func (l *LogParserPlugin) parser() { if m != nil { l.acc.AddFields(m.Name(), m.Fields(), m.Tags(), m.Time()) } + } else { + log.Println("E! Error parsing log line: " + err.Error()) } } }