|
| 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 |
0 commit comments