diff --git a/src/main.rs b/src/main.rs index bdbdf18..b99b83b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,6 +50,7 @@ async fn main() -> Result<(), Error> { tokio::spawn(connection); client.execute("create table if not exists log( + prio smallint, rcv_ip inet, rcv_date timestamptz, date timestamptz, @@ -61,7 +62,7 @@ async fn main() -> Result<(), Error> { let client = Arc::new(client); let insert_statement = client - .prepare("insert into log(rcv_ip, rcv_date, date, daemon, message) values ($1, $2, $3, $4, $5)").await?; + .prepare("insert into log(prio, rcv_ip, rcv_date, date, daemon, message) values ($1, $2, $3, $4, $5, $6)").await?; let mut listener = TcpListener::bind(&options.addr).await .map_err(|e| format!("could not bind to {} with error {:?}", &options.addr, e))?; @@ -100,9 +101,9 @@ async fn handle_peer(stream: TcpStream, peer: SocketAddr, db: Arc, inser loop { match lines.next().await.transpose()? { Some(line) => { - let (now, date, service, log) = parse_line(&line)?; + let (prio, now, date, service, log) = parse_line(&line)?; if !blacklist.contains(service) { - db.execute(&insert_statement, &[&ip, &now, &date, &service, &log]).await?; + db.execute(&insert_statement, &[&prio, &ip, &now, &date, &service, &log]).await?; } }, None => break, @@ -118,7 +119,15 @@ async fn handle_peer(stream: TcpStream, peer: SocketAddr, db: Arc, inser * , log entry * ) */ -fn parse_line(line: &'_ str) -> Result<(DateTime, DateTime, &'_ str, &'_ str), Error> { +fn parse_line(line: &'_ str) -> Result<(i16, DateTime, DateTime, &'_ str, &'_ str), Error> { + let mut prio_and_remainder = line.splitn(2, '>'); + let prio = prio_and_remainder.next().ok_or("log did not contain priority")?; + let prio = &prio[1..]; + let prio = prio.parse() + .map_err(|e| format!("could not parse priority {}: {}",prio, e))?; + + + let line = prio_and_remainder.next().expect("splitn should always return a second part"); let (date, line) = line.split_at(16); // we need to prepend the current year and timezone, as that is not stated in the logfile @@ -126,7 +135,8 @@ fn parse_line(line: &'_ str) -> Result<(DateTime, DateTime, let mut base = format!("{}", now.format("%Y %z ")); base.push_str(date); - let date = DateTime::parse_from_str(&base, "%Y %z %b %e %H:%M:%S ")?; + let date = DateTime::parse_from_str(&base, "%Y %z %b %e %H:%M:%S "). + map_err(|e| format!("could not parse {}{} {}", date, line, e))?; let mut parts = line.splitn(2, ':'); @@ -135,5 +145,5 @@ fn parse_line(line: &'_ str) -> Result<(DateTime, DateTime, let service = service_parts.next().ok_or("could not split pid from service")?.trim(); let log = parts.next().ok_or("could not parse logfile")?.trim(); - Ok((now, date, service, log)) + Ok((prio, now, date, service, log)) }