Skip to content

Commit ba20888

Browse files
authored
Merge pull request #207 from willmoffat/main
new: kbdebug.txt parser
2 parents 0a76f9f + 63486c8 commit ba20888

3 files changed

Lines changed: 78 additions & 0 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ dependencies = [
3636
"jinja2>=3.1.0,<3.2.0",
3737
"matplotlib>=3.10.0,<3.11.0",
3838
"orjsonl>=1.0.0,<1.1.0",
39+
"pyparsing>=3.2, <3.3",
3940
]
4041

4142

src/sysdiagnose/parsers/kbdebug.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#! /usr/bin/env python3
2+
3+
import os
4+
from sysdiagnose.utils.base import BaseParserInterface, SysdiagnoseConfig, logger, Event
5+
from pyparsing import Regex, SkipTo, StringEnd
6+
7+
from datetime import datetime
8+
9+
10+
class KbdebugParser(BaseParserInterface):
11+
description = "kbdebug.txt logfile parser"
12+
format = "jsonl" # by default json, use jsonl for event-based data
13+
14+
def __init__(self, config: SysdiagnoseConfig, case_id: str):
15+
super().__init__(__file__, config, case_id)
16+
17+
def get_log_files(self) -> list:
18+
log_files = [
19+
"kbdebug.txt"
20+
]
21+
return [os.path.join(self.case_data_subfolder, log_files) for log_files in log_files]
22+
23+
def execute(self) -> list | dict:
24+
fmt_timestamp = Regex(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \+\d{4}")
25+
fmt_level = Regex(r"\w+")
26+
fmt_line = fmt_timestamp("timestamp") + ": " + fmt_level("level") + ": " + SkipTo(fmt_timestamp | StringEnd(), include=False)("message")
27+
28+
result = []
29+
log_files = self.get_log_files()
30+
for log_file in log_files:
31+
with open(log_file, 'r') as f:
32+
lines = f.read()
33+
for tokens, _start, _end in fmt_line.scanString(lines):
34+
# print(f"Timestamp: {tokens.timestamp}")
35+
# print(f"Level: {tokens.level}")
36+
# print(f"Message: {tokens.message}")
37+
try:
38+
timestamp = datetime.strptime(tokens.timestamp, '%Y-%m-%d %H:%M:%S %z')
39+
event = Event(
40+
datetime=timestamp,
41+
message=tokens.message, # The rest of the kbdebug entry
42+
module=self.module_name,
43+
timestamp_desc='kbdebug event',
44+
data={
45+
"level": tokens.level
46+
}
47+
)
48+
result.append(event.to_dict())
49+
except Exception:
50+
logger.exception("Failed to parse timestamp or create event")
51+
52+
return result

tests/test_parsers_kbdebug.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from sysdiagnose.parsers.kbdebug import KbdebugParser
2+
from tests import SysdiagnoseTestCase
3+
import unittest
4+
import os
5+
6+
7+
class TestParsersSys(SysdiagnoseTestCase):
8+
9+
def test_parsekbdebug(self):
10+
for case_id, _case in self.sd.cases().items():
11+
p = KbdebugParser(self.sd.config, case_id=case_id)
12+
files = p.get_log_files()
13+
self.assertTrue(len(files) > 0)
14+
15+
p.save_result(force=True)
16+
self.assertTrue(os.path.isfile(p.output_file))
17+
18+
result = p.get_result()
19+
self.assertGreater(len(result), 0)
20+
for item in result:
21+
self.assert_has_required_fields_jsonl(item)
22+
23+
24+
if __name__ == '__main__':
25+
unittest.main()

0 commit comments

Comments
 (0)