From b9457a109268ef1c055f4aa5b4f92a42afc21c24 Mon Sep 17 00:00:00 2001 From: Cameron Sparr Date: Tue, 21 Feb 2017 19:50:10 +0100 Subject: [PATCH] log error message when invalid regex is used closes #2178 --- CHANGELOG.md | 1 + plugins/inputs/logparser/grok/grok_test.go | 37 ++++++++++++++++++++++ plugins/inputs/logparser/logparser.go | 2 ++ 3 files changed, 40 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 509d6f2f1e7dc..2a43e844f993b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,7 @@ be deprecated eventually. - [#2390](https://github.com/influxdata/telegraf/issues/2390): Empty tag value causes error on InfluxDB output. - [#2380](https://github.com/influxdata/telegraf/issues/2380): buffer_size field value is negative number from "internal" plugin. - [#2414](https://github.com/influxdata/telegraf/issues/2414): Missing error handling in the MySQL plugin leads to segmentation violation. +- [#2178](https://github.com/influxdata/telegraf/issues/2178): logparser: regexp with lookahead. ## v1.2.1 [2017-02-01] 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()) } } }