From 8e64e12fedd4ed0b03c36a93006485e985f787c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Gonz=C3=A1lez=20Palomo?= Date: Sun, 5 Mar 2017 22:49:06 +0100 Subject: [PATCH] Fix sliced multi-line events The original multi-line implementation had a problem: multi-line events got sliced in two when they crossed the spool size barrier, because the code still counted each line as a spool entry. With multi-line entries that is no longer correct. This fix simply reduces the spaceLeftInSpool variable only after adding an entry. --- .../fetter/logstashforwarder/FileReader.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/info/fetter/logstashforwarder/FileReader.java b/src/main/java/info/fetter/logstashforwarder/FileReader.java index 0295cb8..414e810 100644 --- a/src/main/java/info/fetter/logstashforwarder/FileReader.java +++ b/src/main/java/info/fetter/logstashforwarder/FileReader.java @@ -150,25 +150,26 @@ public class FileReader extends Reader { pos = reader.getFilePointer(); if (multiline == null) { addEvent(state, pos, line); + spaceLeftInSpool--; } else { if (logger.isTraceEnabled()) { logger.trace("-- Multiline : " + multiline); logger.trace("-- Multiline : matches " + multiline.isPatternFound(line)); } - if (multiline.isPatternFound(line)) - { - // buffer the line - if (bufferedLines.position() > 0) { - bufferedLines.put(Multiline.JOINT); - } - bufferedLines.put(line); + if (multiline.isPatternFound(line)) { + // buffer the line + if (bufferedLines.position() > 0) { + bufferedLines.put(Multiline.JOINT); } + bufferedLines.put(line); + } else { if (multiline.isPrevious()) { // did not match, so new event started if (bufferedLines.position() > 0) { addEvent(state, pos, extractBytes(bufferedLines)); + spaceLeftInSpool--; } bufferedLines.put(line); } @@ -178,14 +179,16 @@ public class FileReader extends Reader { bufferedLines.put(Multiline.JOINT); bufferedLines.put(line); addEvent(state, pos, extractBytes(bufferedLines)); + spaceLeftInSpool--; } - else + else { addEvent(state, pos, line); + spaceLeftInSpool--; + } } } } line = readLine(reader); - spaceLeftInSpool--; } if (bufferedLines.position() > 0) { addEvent(state, pos, extractBytes(bufferedLines)); // send any buffered lines left