diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 5a8b37bf45c..00dab286e98 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -462,6 +462,7 @@ https://github.com/elastic/beats/compare/v6.2.3...v6.3.0[View commits] - Add support human friendly size for the UDP input. {pull}6886[6886] - Add Syslog input to ingest RFC3164 Events via TCP and UDP {pull}6842[6842] - Remove the undefined `username` option from the Redis input and clarify the documentation. {pull}6662[6662] +- Add log.original to each log event. {pull}[] *Heartbeat* diff --git a/filebeat/_meta/common.reference.p2.yml b/filebeat/_meta/common.reference.p2.yml index 8788afad00e..b10e81a71a9 100644 --- a/filebeat/_meta/common.reference.p2.yml +++ b/filebeat/_meta/common.reference.p2.yml @@ -80,6 +80,11 @@ filebeat.inputs: # This is especially useful for multiline log messages which can get large. #max_bytes: 10485760 + + # By default Filebeat adds log.original to each event as this contains the original log. + # This can be useful to reprocess the log files. + #original_message: true + ### Recursive glob configuration # Expand "**" patterns into regular glob patterns. diff --git a/filebeat/_meta/fields.common.yml b/filebeat/_meta/fields.common.yml index 5781e497879..bed2fb77eb9 100644 --- a/filebeat/_meta/fields.common.yml +++ b/filebeat/_meta/fields.common.yml @@ -108,6 +108,12 @@ description: > Logging level. + - name: log.original + type: keyword + description: > + The unprocessed original log message. This can be used for reprocessing logs. + index: false + - name: event.created type: date description: > diff --git a/filebeat/docs/fields.asciidoc b/filebeat/docs/fields.asciidoc index 4f5ec70dcba..863e870ee17 100644 --- a/filebeat/docs/fields.asciidoc +++ b/filebeat/docs/fields.asciidoc @@ -2682,6 +2682,18 @@ type: keyword Logging level. +-- + +*`log.original`*:: ++ +-- +type: keyword + +The unprocessed original log message. This can be used for reprocessing logs. + + +Field is not indexed. + -- *`event.created`*:: diff --git a/filebeat/filebeat.reference.yml b/filebeat/filebeat.reference.yml index f798e4ed301..6bbb698080f 100644 --- a/filebeat/filebeat.reference.yml +++ b/filebeat/filebeat.reference.yml @@ -435,6 +435,11 @@ filebeat.inputs: # This is especially useful for multiline log messages which can get large. #max_bytes: 10485760 + + # By default Filebeat adds log.original to each event as this contains the original log. + # This can be useful to reprocess the log files. + #original_message: true + ### Recursive glob configuration # Expand "**" patterns into regular glob patterns. diff --git a/filebeat/include/fields.go b/filebeat/include/fields.go index dabf266ec49..83623cea844 100644 --- a/filebeat/include/fields.go +++ b/filebeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "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" + return "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" } diff --git a/filebeat/input/log/config.go b/filebeat/input/log/config.go index b88c11d932b..43ec9080bcc 100644 --- a/filebeat/input/log/config.go +++ b/filebeat/input/log/config.go @@ -43,16 +43,17 @@ var ( CleanInactive: 0, // Input - Enabled: true, - IgnoreOlder: 0, - ScanFrequency: 10 * time.Second, - CleanRemoved: true, - HarvesterLimit: 0, - Symlinks: false, - TailFiles: false, - ScanSort: "", - ScanOrder: "asc", - RecursiveGlob: true, + Enabled: true, + IgnoreOlder: 0, + ScanFrequency: 10 * time.Second, + CleanRemoved: true, + HarvesterLimit: 0, + Symlinks: false, + TailFiles: false, + ScanSort: "", + ScanOrder: "asc", + RecursiveGlob: true, + OriginalMessage: true, // Harvester BufferSize: 16 * humanize.KiByte, @@ -96,11 +97,12 @@ type config struct { ScanOrder string `config:"scan.order"` ScanSort string `config:"scan.sort"` - ExcludeLines []match.Matcher `config:"exclude_lines"` - IncludeLines []match.Matcher `config:"include_lines"` - MaxBytes int `config:"max_bytes" validate:"min=0,nonzero"` - Multiline *multiline.Config `config:"multiline"` - JSON *readjson.Config `config:"json"` + ExcludeLines []match.Matcher `config:"exclude_lines"` + IncludeLines []match.Matcher `config:"include_lines"` + MaxBytes int `config:"max_bytes" validate:"min=0,nonzero"` + Multiline *multiline.Config `config:"multiline"` + JSON *readjson.Config `config:"json"` + OriginalMessage bool `config:"original_message"` // Hidden on purpose, used by the docker input: DockerJSON *struct { diff --git a/filebeat/input/log/harvester.go b/filebeat/input/log/harvester.go index d5ffb3a3828..38e070808b3 100644 --- a/filebeat/input/log/harvester.go +++ b/filebeat/input/log/harvester.go @@ -306,6 +306,10 @@ func (h *Harvester) Run() error { } fields.DeepUpdate(message.Fields) + if h.config.OriginalMessage { + fields.Put("log.original", string(message.Original)) + } + // Check if json fields exist var jsonFields common.MapStr if f, ok := fields["json"]; ok { diff --git a/filebeat/reader/message.go b/filebeat/reader/message.go index c5e965b10d0..6ac2e1d1169 100644 --- a/filebeat/reader/message.go +++ b/filebeat/reader/message.go @@ -26,10 +26,11 @@ import ( // Message represents a reader event with timestamp, content and actual number // of bytes read from input before decoding. type Message struct { - Ts time.Time // timestamp the content was read - Content []byte // actual content read - Bytes int // total number of bytes read to generate the message - Fields common.MapStr // optional fields that can be added by reader + Ts time.Time // timestamp the content was read + Content []byte // actual content read + Original []byte // original content read + Bytes int // total number of bytes read to generate the message + Fields common.MapStr // optional fields that can be added by reader } // IsEmpty returns true in case the message is empty diff --git a/filebeat/reader/multiline/multiline.go b/filebeat/reader/multiline/multiline.go index 57209be94cd..d1223034c78 100644 --- a/filebeat/reader/multiline/multiline.go +++ b/filebeat/reader/multiline/multiline.go @@ -269,6 +269,7 @@ func (mlr *Reader) clear() { func (mlr *Reader) finalize() reader.Message { // Copy message from existing content msg := mlr.message + msg.Original = mlr.message.Content mlr.clear() return msg } diff --git a/filebeat/reader/readfile/strip_newline.go b/filebeat/reader/readfile/strip_newline.go index 3394cb9289e..cf5b506732e 100644 --- a/filebeat/reader/readfile/strip_newline.go +++ b/filebeat/reader/readfile/strip_newline.go @@ -42,6 +42,10 @@ func (p *StripNewline) Next() (reader.Message, error) { L := message.Content message.Content = L[:len(L)-lineEndingChars(L)] + // Also strip new lines from raw message + M := message.Original + message.Original = M[:len(M)-lineEndingChars(M)] + return message, err } diff --git a/filebeat/tests/system/config/filebeat.yml.j2 b/filebeat/tests/system/config/filebeat.yml.j2 index 52e099d8511..67197132374 100644 --- a/filebeat/tests/system/config/filebeat.yml.j2 +++ b/filebeat/tests/system/config/filebeat.yml.j2 @@ -31,6 +31,7 @@ filebeat.{{input_config | default("inputs")}}: harvester_limit: {{harvester_limit | default(0) }} symlinks: {{symlinks}} pipeline: {{pipeline}} + original_message: {{original_message| default("true")}} {%- if input_processors %} processors: {%- for processor in input_processors %} diff --git a/filebeat/tests/system/test_harvester.py b/filebeat/tests/system/test_harvester.py index 0f8ed244c59..68638748c3e 100644 --- a/filebeat/tests/system/test_harvester.py +++ b/filebeat/tests/system/test_harvester.py @@ -818,3 +818,58 @@ def test_decode_error(self): output = self.read_output_json() assert output[2]["message"] == "hello world2" + + def test_original_message_enabled(self): + """ + Test original message enabled for json use case + """ + self.render_config_template( + path=os.path.abspath(self.working_dir) + "/log/*", + json=dict( + keys_under_root=True, + ), + ) + os.mkdir(self.working_dir + "/log/") + logfile = self.working_dir + "/log/test.log" + message = '{"hello":"world"}' + with open(logfile, 'a') as file: + file.write(message + "\n") + + proc = self.start_beat() + self.wait_until( + lambda: self.output_has(lines=1), + max_timeout=10) + proc.check_kill_and_wait() + + output = self.read_output() + assert len(output) == 1 + + assert output[0]["log.message"] == message + + def test_original_message_disabled(self): + """ + Test original message enabled for json use case + """ + self.render_config_template( + path=os.path.abspath(self.working_dir) + "/log/*", + json=dict( + keys_under_root=True, + ), + original_message=False, + ) + os.mkdir(self.working_dir + "/log/") + logfile = self.working_dir + "/log/test.log" + message = '{"hello":"world"}' + with open(logfile, 'a') as file: + file.write(message + "\n") + + proc = self.start_beat() + self.wait_until( + lambda: self.output_has(lines=1), + max_timeout=10) + proc.check_kill_and_wait() + + output = self.read_output() + assert len(output) == 1 + + assert "log.original" not in output[0] diff --git a/filebeat/tests/system/test_json.py b/filebeat/tests/system/test_json.py index d98b6025aa6..c89246d239e 100644 --- a/filebeat/tests/system/test_json.py +++ b/filebeat/tests/system/test_json.py @@ -42,7 +42,8 @@ def test_docker_logs_filtering(self): self.render_config_template( path=os.path.abspath(self.working_dir) + "/log/*", json=dict(message_key="log", keys_under_root=True), - exclude_lines=["windows"] + exclude_lines=["windows"], + original_message=False, ) os.mkdir(self.working_dir + "/log/") @@ -74,7 +75,8 @@ def test_docker_logs_multiline(self): multiline=True, pattern="^\[log\]", match="after", - negate="true" + negate="true", + original_message=False, ) os.mkdir(self.working_dir + "/log/")