From 56516545338f7f0111c8355a2883474cec786476 Mon Sep 17 00:00:00 2001 From: Pavel Ivanov Date: Thu, 8 Oct 2020 10:52:58 +0300 Subject: [PATCH] fix: handle correctly multiple log messages per line --- src/app.rs | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/app.rs b/src/app.rs index 5a2c82dc..22ab3c23 100644 --- a/src/app.rs +++ b/src/app.rs @@ -127,32 +127,32 @@ impl App { buf: &mut Vec, ) { for data in segment.data().split(|c| *c == b'\n') { - let data = strip(data, b'\r'); + let data = trim_right(data, |ch| ch == b'\r'); if data.len() == 0 { continue; } - match json::from_slice::(data) { - Ok(rec) => { - if rec.matches(&self.options.filter) { - formatter.format_record(buf, &rec); - } - } - _ => { - buf.extend_from_slice(data); - buf.push(b'\n'); + let mut stream = json::Deserializer::from_slice(data).into_iter::(); + while let Some(Ok(record)) = stream.next() { + if record.matches(&self.options.filter) { + formatter.format_record(buf, &record); } } + let remainder = trim_right(&data[stream.byte_offset()..], |ch| match ch { + b'\r' | b'\n' | b' ' | b'\t' => true, + _ => false, + }); + if remainder.len() > 0 { + buf.extend_from_slice(remainder); + buf.push(b'\n'); + } } } } -fn strip<'a>(slice: &'a [u8], ch: u8) -> &'a [u8] { - let n = slice.len(); - if n == 0 { - slice - } else if slice[n - 1] == ch { - &slice[..n - 1] +fn trim_right<'a, F: Fn(u8) -> bool>(slice: &'a [u8], predicate: F) -> &'a [u8] { + if let Some(pos) = slice.iter().rposition(|&ch| !predicate(ch)) { + &slice[..pos + 1] } else { - slice + &slice[0..0] } }