diff --git a/src/config.rs b/src/config.rs index 5555755..bcd4bd4 100644 --- a/src/config.rs +++ b/src/config.rs @@ -23,6 +23,7 @@ use crate::renderer; pub enum RendererType { Auto, Plain, + Raw, Json, Styled, Interactive @@ -49,6 +50,7 @@ impl RendererType { match *self { RendererType::Auto => get_auto_renderer(config), RendererType::Plain => renderer::plain_renderer, + RendererType::Raw => renderer::raw_renderer, RendererType::Json => renderer::json_renderer, RendererType::Styled => renderer::styled_renderer, RendererType::Interactive => renderer::interactive_renderer, @@ -63,6 +65,7 @@ impl FromStr for RendererType { match s { "auto" => Ok(RendererType::Auto), "plain" => Ok(RendererType::Plain), + "raw" => Ok(RendererType::Raw), "json" => Ok(RendererType::Json), "styled" => Ok(RendererType::Styled), "interactive" => Ok(RendererType::Interactive), diff --git a/src/parser/json.rs b/src/parser/json.rs index 0a1a090..b4c2511 100644 --- a/src/parser/json.rs +++ b/src/parser/json.rs @@ -94,6 +94,7 @@ pub fn get_timestamp(msg: &Map) -> Option<(&str, DateTime)> } pub fn parse_document( + line: &str, kind: MessageKind, doc: Map, meta: Option @@ -143,6 +144,7 @@ pub fn parse_document( let message = Message { kind, + raw: line.to_string(), reader_metadata: meta, timestamp, level, text, metadata, mapped_fields }; @@ -159,7 +161,7 @@ pub fn parse_json( } match serde_json::from_str(line) { - Ok(message) => parse_document(MessageKind::Json, message, meta), + Ok(message) => parse_document(line, MessageKind::Json, message, meta), Err(_) => Ok(None) } } diff --git a/src/parser/klog.rs b/src/parser/klog.rs index 1e14f05..e6f57a1 100644 --- a/src/parser/klog.rs +++ b/src/parser/klog.rs @@ -82,6 +82,7 @@ pub fn parse_klog( return Ok(Some(Message { kind: MessageKind::Klog, reader_metadata: meta, + raw: line.to_string(), text: Some(text.to_string()), timestamp, level, metadata, diff --git a/src/parser/logrus.rs b/src/parser/logrus.rs index 926993f..2a08dac 100644 --- a/src/parser/logrus.rs +++ b/src/parser/logrus.rs @@ -73,7 +73,7 @@ pub fn parse_logrus( if doc.is_empty() { Ok(None) } else { - parse_document(MessageKind::Logrus, doc, meta) + parse_document(line, MessageKind::Logrus, doc, meta) } }, Err(_) => Ok(None) diff --git a/src/parser/plain.rs b/src/parser/plain.rs index 9df3029..ae81419 100644 --- a/src/parser/plain.rs +++ b/src/parser/plain.rs @@ -56,6 +56,7 @@ pub fn parse_plain( kind: MessageKind::Plain, timestamp: get_meta_timestamp(&meta), level: get_log_level(line), + raw: line.to_string(), text: Some(String::from(line)), metadata: HashMap::new(), reader_metadata: meta, diff --git a/src/parser/regex.rs b/src/parser/regex.rs index 19469ad..c024359 100644 --- a/src/parser/regex.rs +++ b/src/parser/regex.rs @@ -111,6 +111,7 @@ fn parse_mapping( let message = Message { kind: MessageKind::Regex, reader_metadata: meta.clone(), + raw: line.to_string(), timestamp, level, text, metadata, mapped_fields: HashMap::new() }; diff --git a/src/parser/types.rs b/src/parser/types.rs index a825dee..f4d40df 100644 --- a/src/parser/types.rs +++ b/src/parser/types.rs @@ -107,6 +107,9 @@ pub struct Message { #[serde(skip_serializing_if = "Option::is_none")] pub level: Option, + // The raw message content + pub raw: String, + /// The message text #[serde(skip_serializing_if = "Option::is_none")] pub text: Option, diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index afc3afa..eeb3d80 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -5,6 +5,7 @@ mod common; mod json; mod plain; mod styled; +mod raw; pub mod interactive; pub use types::*; @@ -12,3 +13,4 @@ pub use styled::styled_renderer; pub use interactive::interactive_renderer; pub use plain::plain_renderer; pub use json::json_renderer; +pub use raw::raw_renderer; diff --git a/src/renderer/raw.rs b/src/renderer/raw.rs new file mode 100644 index 0000000..a9bd333 --- /dev/null +++ b/src/renderer/raw.rs @@ -0,0 +1,22 @@ +// (C) Copyright 2019 Hewlett Packard Enterprise Development LP + +use std::sync::Arc; +use std::sync::mpsc::Receiver; +use std::thread::{self, JoinHandle}; + +use crate::config::Config; +use crate::renderer::types::*; + +pub fn raw_renderer(_: Arc, rx: Receiver) -> JoinHandle<()> { + thread::Builder::new().name("raw_renderer".to_string()).spawn(move || { + for entry in rx { + if entry.eof.is_some() { + break; + } + + if let Some(message) = entry.message { + println!("{}", message.message.raw); + } + } + }).unwrap() +} diff --git a/src/renderer/types.rs b/src/renderer/types.rs index f784089..391ca2e 100644 --- a/src/renderer/types.rs +++ b/src/renderer/types.rs @@ -26,6 +26,7 @@ impl MessageEntry { kind: MessageKind::Internal, timestamp: Some(Utc::now()), level: Some(LogLevel::Int), + raw: message.to_string(), text: Some(message.to_string()), metadata: HashMap::new(), reader_metadata: None,