File 0001-high-history-Parse-log-lines-without-timestamp-bsc-9.patch of Package crmsh.1619
From 029b21ed11f75bc4b6d1ed1bdc2928c7b5902555 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kristoffer=20Gr=C3=B6nlund?= <krig@koru.se>
Date: Wed, 20 Jan 2016 11:51:20 +0100
Subject: [PATCH 1/3] high: history: Parse log lines without timestamp
(bsc#955581)
If there are lines in the log that don't have a recognizable
timestamp or node name, fall back to using the same timestamp
and node name as the last log line that did parse correctly.
---
modules/history.py | 52 +++++++++++++++++++++++++++++++++++++---------------
modules/utils.py | 2 +-
2 files changed, 38 insertions(+), 16 deletions(-)
diff --git a/modules/history.py b/modules/history.py
index f7cd0a0..db7d0c5 100644
--- a/modules/history.py
+++ b/modules/history.py
@@ -73,29 +73,42 @@ def make_time(t):
_syslog2node_formats = (re.compile(r'^[a-zA-Z]{2,4} \d{1,2} \d{2}:\d{2}:\d{2}\s+(?:\[\d+\])?\s*([\S]+)'),
- re.compile(r'^\d{4}-\d{2}-\d{2}T\S+\s+(?:\[\d+\])?\s*([\S]+)'))
+ re.compile(r'^\d{4}-\d{2}-\d{2}T\S+\s+(?:\[\d+\])?\s*([\S]+)'),
+ re.compile(r'^\d{4}\/\d{2}\/\d{2}_\d{2}:\d{2}:\d{2}'))
+_syslog_ts_prev = None
def syslog_ts(s):
"""
Finds the timestamp in the given line
Returns as floating point, seconds
"""
- fmt1, fmt2 = _syslog2node_formats
+ global _syslog_ts_prev
+ fmt1, fmt2, fmt3 = _syslog2node_formats
m = fmt1.match(s)
if m:
if YEAR is None:
set_year()
tstr = ' '.join([YEAR] + s.split()[0:3])
- return datetime_to_timestamp(parse_time(tstr))
+ _syslog_ts_prev = datetime_to_timestamp(parse_time(tstr))
+ return _syslog_ts_prev
m = fmt2.match(s)
if m:
tstr = s.split()[0]
- return datetime_to_timestamp(parse_time(tstr))
+ _syslog_ts_prev = datetime_to_timestamp(parse_time(tstr))
+ return _syslog_ts_prev
+
+ m = fmt3.match(s)
+ if m:
+ tstr = s.split()[0].replace('_', ' ')
+ _syslog_ts_prev = datetime_to_timestamp(parse_time(tstr))
+ return _syslog_ts_prev
common_debug("malformed line: %s" % s)
- return None
+ return _syslog_ts_prev
+
+_syslog_node_prev = None
def syslog2node(s):
@@ -111,27 +124,36 @@ def syslog2node(s):
RFC5424 (2):
<TS> [<PID>] <node> ...
'''
+ global _syslog_node_prev
- fmt1, fmt2 = _syslog2node_formats
+ fmt1, fmt2, _ = _syslog2node_formats
m = fmt1.search(s)
if m:
- return m.group(1)
+ _syslog_node_prev = m.group(1)
+ return _syslog_node_prev
m = fmt2.search(s)
if m:
- return m.group(1)
+ _syslog_node_prev = m.group(1)
+ return _syslog_node_prev
try:
# strptime defaults year to 1900 (sigh)
time.strptime(' '.join(s.split()[0:3]),
"%b %d %H:%M:%S")
- return s.split()[3]
- except: # try the rfc5424
- try:
- parse_time(s.split()[0])
- return s.split()[1]
- except Exception:
- return None
+ _syslog_node_prev = s.split()[3]
+ return _syslog_node_prev
+ except Exception: # try the rfc5424
+ rfc5424 = s.split()[0]
+ if 'T' in rfc5424:
+ try:
+ parse_time(rfc5424)
+ _syslog_node_prev = s.split()[1]
+ return _syslog_node_prev
+ except Exception:
+ return _syslog_node_prev
+ else:
+ return _syslog_node_prev
def seek_to_edge(f, ts, to_end):
diff --git a/modules/utils.py b/modules/utils.py
index a72aa19..e958c8a 100644
--- a/modules/utils.py
+++ b/modules/utils.py
@@ -1082,7 +1082,7 @@ def parse_time(t):
# convert to UTC from local time
dt = make_datetime_naive(dt.replace(tzinfo=dateutil.tz.tzlocal()))
except ValueError, msg:
- common_err("%s: %s" % (t, msg))
+ common_err("parse_time %s: %s" % (t, msg))
return None
except ImportError, msg:
try:
--
2.7.0