From f7833fdddd6168ab069fb38ff23bbbd29da09900 Mon Sep 17 00:00:00 2001 From: dshett549 Date: Mon, 19 Jan 2026 09:44:40 +0530 Subject: [PATCH 01/13] RDK-60409: Component independent Tool Development for Noisy Log detection Reason for change: Component independent tool for Noisy Log detection Test Procedure: Tested and verified Risks: Medium Signed-off-by: dshett549 --- .github/workflows/log-quality-rules.yml | 144 ++++++++++++++++++++++ noisylogdetector.py | 155 ++++++++++++++++++++++++ rules.yml | 61 ++++++++++ src/rtmessage/rtLog.c | 2 +- 4 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/log-quality-rules.yml create mode 100644 noisylogdetector.py create mode 100644 rules.yml diff --git a/.github/workflows/log-quality-rules.yml b/.github/workflows/log-quality-rules.yml new file mode 100644 index 00000000..d311b43c --- /dev/null +++ b/.github/workflows/log-quality-rules.yml @@ -0,0 +1,144 @@ +name: log-quality-rules +on: + push: + branches: [ main, develop, release, support/*, hotfix/*, topic/* ] + pull_request: + branches: [ main, develop, release, support/*, hotfix/*, topic/* ] +jobs: + all: + runs-on: ubuntu-22.04 + steps: + - name: Set up cache + id: cache + uses: actions/cache@v3 + with: + path: | + build + install + key: ${{ runner.os }}-${{ github.sha }} + + - name: Set up CMake + # 3.16.x To support flow control commands to be overridden. + # Installs in: find /opt -ipath *bin/cmake + uses: jwlawson/actions-setup-cmake@v1.12 + with: + cmake-version: '3.16.x' + - name: Install packages + run: > + sudo apt update && sudo apt install -y libcurl4-openssl-dev libgtest-dev lcov gcovr libmsgpack* libcjson-dev build-essential + - name: Checkout rbus + if: steps.cache.outputs.cache-hit != 'true' + uses: actions/checkout@v3 + with: + path: rbus + - name: Install dependencies + run: pip install pyyaml + - name: Configure Rbus + if: steps.cache.outputs.cache-hit != 'true' + run: > + cmake + -S "${{github.workspace}}/rbus" + -B build/rbus + -DCMAKE_INSTALL_PREFIX="${{github.workspace}}/install/usr" + -DBUILD_FOR_DESKTOP=ON + -DENABLE_UNIT_TESTING=ON + -DENABLE_CODE_COVERAGE=ON + -DCMAKE_BUILD_TYPE=Debug + - name: Build Rbus + if: steps.cache.outputs.cache-hit != 'true' + run: > + make -C build/rbus + - name: Install rbus + if: steps.cache.outputs.cache-hit != 'true' + run: > + make -C build/rbus install + - name: Start rtrouted + # nohup to keep it running. + run: | + cd install/usr + export PREFIX=$PWD + export LD_LIBRARY_PATH=$PREFIX/lib + nohup ./bin/rtrouted -f -l DEBUG > /tmp/rtrouted_log.txt & + - name: Run drop test with inactive provider + continue-on-error: true + run: | + cd install/usr + export PREFIX=$PWD + export LD_LIBRARY_PATH=$PREFIX/lib + nohup ./bin/rbusSampleProvider > log_sampleProvider.log 2>&1 & + sleep 1 + nohup stdbuf -oL -eL ./bin/rbusBlockingProvider > log_blockingProvider.log 2>&1 & + sleep 1 + ./bin/rbusDmlBlockingConsumer > log_dmlBlockingConsumer.log 2>&1 + cat sampleProvider.log || true + cat blockingProvider.log || true + cat dmlBlockingConsumer.log || true + - name: Run RbusTestTimeoutValues Unit test + run: | + cd install/usr + export PREFIX=$PWD + export LD_LIBRARY_PATH=$PREFIX/lib + nohup ./bin/rbusTestTimeoutValuesProvider > log_testTimeoutValuesProvider.txt & + ./bin/rbusTestTimeoutValuesConsumer > log_testTimeoutValuesConsumer.txt & + - name: Run Unit test + run: | + cd install/usr + export PREFIX=$PWD + export LD_LIBRARY_PATH=$PREFIX/lib + nohup ./bin/rbusTestProvider >/tmp/log_TestAppProvider.txt & + ./bin/rbusTestConsumer -a > /tmp/log_TestConsumer.txt & + - name: Run multiRbusOpenMethod Unit Test + run: | + cd install/usr + export PREFIX=$PWD + export LD_LIBRARY_PATH=$PREFIX/lib + ./bin/multiRbusOpenMethodProvider > /tmp/log_MultiRbusOpenMethodProvider.txt & + ./bin/multiRbusOpenMethodConsumer > /tmp/log_MultiRbusOpenMethodConsumer.txt& + - name: Run multiRbusOpenSubscribe Unit test + run: | + cd install/usr + export PREFIX=$PWD + export LD_LIBRARY_PATH=$PREFIX/lib + nohup ./bin/multiRbusOpenProvider >/tmp/log_multiRbusOpenProvider.txt & + ./bin/multiRbusOpenConsumer >/tmp/log_multiRbusOpenConsumer.txt & + - name: Run multiRbusOpenGet Unit test + run: | + cd install/usr + export PREFIX=$PWD + export LD_LIBRARY_PATH=$PREFIX/lib + nohup ./bin/multiRbusOpenRbusGetProvider >/tmp/log_multiRbusOpenRbusGetProvider.txt & + ./bin/multiRbusOpenRbusGetConsumer >/tmp/log_multiRbusOpenRbusGetConsumer.txt & + - name: Run multiRbusOpenSet Unit test + run: | + cd install/usr + export PREFIX=$PWD + export LD_LIBRARY_PATH=$PREFIX/lib + nohup ./bin/multiRbusOpenRbusGetProvider >/tmp/log_multiRbusOpenRbusSetProvider.txt & + ./bin/multiRbusOpenRbusSetConsumer >/tmp/log_multiRbusOpenRbusSetConsumer.txt & + - name: Run Gtest Cases + run: | + cd build/rbus + nohup ./src/session_manager/rbus_session_mgr & + ./unittests/rbus_gtest.bin > /tmp/logs.txt & + - name: Analyze logs + run: | + cd ${{github.workspace}}/rbus + for f in /tmp/logs*.txt; do + python noisylogdetector.py "$f" "/tmp/noisy_log_report_$(basename "$f" .txt).html" + done + cd /tmp + ls -l + - name: Stop SessionManager + run: | + killall -15 rbus_session_mgr + - name: Stop rtrouted + run: | + cd install/usr + export PREFIX=$PWD + export LD_LIBRARY_PATH=$PREFIX/lib + nohup ./bin/rtrouted_diag shutdown + - name: Upload the noisy log report to Pull request using actions + uses: actions/upload-artifact@v4 + with: + name: noisy-log-report + path: /tmp/noisy_log_report_*.html diff --git a/noisylogdetector.py b/noisylogdetector.py new file mode 100644 index 00000000..bd555dda --- /dev/null +++ b/noisylogdetector.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python3 +import re +import sys +import yaml +from collections import defaultdict +from html import escape +from pathlib import Path + +# ----------------------------- +def load_rules(path="rules.yml"): + with open(path, "r") as f: + return yaml.safe_load(f) + +# ----------------------------- +def starts_with_timestamp(line): + """ + Matches: + 04:31:14.109764 + 2024-11-11 04:31:14.109 + Nov 11 04:31:14 + """ + return bool(re.match( + r'^\s*(\d{2}:\d{2}:\d{2}\.\d+|\d{4}-\d{2}-\d{2}|\w{3}\s+\d+\s+\d{2}:\d{2}:\d{2})', + line + )) + +def detect_level(line): + for lvl in ("ERROR", "WARN", "INFO", "DEBUG", "TRACE"): + if re.search(rf"\b{lvl}\b", line): + return lvl + return "UNKNOWN" + +# ----------------------------- +def compile_patterns(patterns): + return [re.compile(p, re.IGNORECASE) for p in patterns] + +# ----------------------------- +def analyze(log_file, rules): + noisy_logs = [] + sensitive_logs = [] + severity_violations = [] + + public_api_res = compile_patterns(rules["public_api_patterns"]) + sensitive_res = compile_patterns(rules["sensitive_patterns"]) + failure_keywords = rules["failure_keywords"] + + in_public_api = False + active_public_api = None + + with open(log_file, "r", errors="ignore") as f: + for ln, line in enumerate(f, 1): + line = line.rstrip() + + if not starts_with_timestamp(line): + continue + + level = detect_level(line) + + # ----------------- Detect public API start + for r in public_api_res: + m = r.search(line) + if m: + in_public_api = True + active_public_api = m.group(0) + break + + # ----------------- Noisy logs + if in_public_api: + if active_public_api not in line: + if level in rules["noisy_log_levels"]: + noisy_logs.append({ + "line": ln, + "level": level, + "log": line, + "reason": f"Internal log during public API execution ({active_public_api})" + }) + + # ----------------- Sensitive logs + for r in sensitive_res: + if r.search(line): + sensitive_logs.append({ + "line": ln, + "log": line, + "reason": "Sensitive / PII data detected" + }) + break + + # ----------------- Severity enforcement + if any(k in line.lower() for k in failure_keywords): + if level not in rules["required_severity_on_failure"]: + severity_violations.append({ + "line": ln, + "level": level, + "log": line, + "reason": "Failure logged without ERROR/WARN" + }) + + + return noisy_logs, sensitive_logs, severity_violations + +# ----------------------------- +def generate_html(noisy, sensitive, severity, output): + with open(output, "w", encoding="utf-8") as f: + f.write(""" + + +Log Quality Report + + + +

Log Quality Report

+""") + + def write_section(title, rows): + f.write(f"

{title}

") + f.write("") + f.write("") + for r in rows: + f.write( + f"" + f"" + f"" + ) + f.write("
LineReasonLog
{r['line']}{escape(r['reason'])}{escape(r['log'])}
") + + write_section("Noisy Logs", noisy) + write_section("Sensitive / PII Logs", sensitive) + write_section("Severity Violations", severity) + + f.write("") + + print(f"Report generated: {output}") + +# ----------------------------- +if __name__ == "__main__": + + if len(sys.argv) < 2: + print("Usage: python3 noisy_log_detector.py ") + sys.exit(1) + + log_file = sys.argv[1] + output = sys.argv[2] + + if not Path(log_file).exists(): + print(f"Log file not found: {log_file}") + sys.exit(1) + + rules = load_rules() + noisy, sensitive, severity = analyze(log_file, rules) + generate_html(noisy, sensitive, severity, output) diff --git a/rules.yml b/rules.yml new file mode 100644 index 00000000..3cbfa291 --- /dev/null +++ b/rules.yml @@ -0,0 +1,61 @@ +# ------------------------------ +# Rules for log analyzer +# ------------------------------ + +# Patterns to detect sensitive information +sensitive_patterns: + # JWT tokens + - '(?i)\btoken\s*[:=]\s*[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\b' + + # API keys + - '(?i)\b(api[_-]?key|apikey)\s*[:=]\s*[A-Za-z0-9]{20,}\b' + + # Password assignments + - '(?i)\b(password|passwd|pwd)\s*[:=]\s*\S{6,}\b' + + # Authorization headers + - '(?i)\bauthorization\s*[:=]\s*(bearer|basic)\s+[A-Za-z0-9+/=._-]+\b' + + # AWS keys + - '\bAKIA[0-9A-Z]{16}\b' + + # Private key blocks + - '-----BEGIN .*PRIVATE KEY-----' + + # URLs + - r'\bhttps?://[^\s]+' + + # IP addresses + - r'\b(?:\d{1,3}\.){3}\d{1,3}\b' + + # MAC addresses + - r'\b([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})\b' + +# Patterns that identify start of public API execution +public_api_patterns: + - 'rbus\.c' + +# Patterns for internal logs that are considered noisy during public API +#internal_log_patterns: +# - r'\binternal_api\b' +# - r'\bdebug_internal\b' +# - r'\bhelper_function\b' + +# Log levels considered noisy +noisy_log_levels: + - DEBUG + - TRACE + - INFO + +# Keywords indicating failure +failure_keywords: + - 'failed' + - 'error' + - 'exception' + - 'invalid' + - 'timeout' + +# Required log levels for failure messages +required_severity_on_failure: + - ERROR + - WARN diff --git a/src/rtmessage/rtLog.c b/src/rtmessage/rtLog.c index ec7cef7d..83b884b6 100644 --- a/src/rtmessage/rtLog.c +++ b/src/rtmessage/rtLog.c @@ -59,7 +59,7 @@ static const char* rtLogLevelStrings[] = }; static rtLogHandler sLogHandler = NULL; -static rtLogLevel sLevel = RT_LOG_WARN; +static rtLogLevel sLevel = RT_LOG_INFO; static rtLoggerSelection sOption = #ifdef ENABLE_RDKLOGGER RT_USE_RDKLOGGER; From a34d2dba169a2ab79b71554dee4c54f0e3d5e539 Mon Sep 17 00:00:00 2001 From: dshett549 Date: Tue, 20 Jan 2026 12:01:01 +0530 Subject: [PATCH 02/13] Address Copilot review comments Signed-off-by: dshett549 --- .github/workflows/log-quality-rules.yml | 12 ++++++------ noisylogdetector.py | 23 +++++++++++++++++------ rules.yml | 6 +++--- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/.github/workflows/log-quality-rules.yml b/.github/workflows/log-quality-rules.yml index d311b43c..a54f9ac0 100644 --- a/.github/workflows/log-quality-rules.yml +++ b/.github/workflows/log-quality-rules.yml @@ -70,9 +70,9 @@ jobs: nohup stdbuf -oL -eL ./bin/rbusBlockingProvider > log_blockingProvider.log 2>&1 & sleep 1 ./bin/rbusDmlBlockingConsumer > log_dmlBlockingConsumer.log 2>&1 - cat sampleProvider.log || true - cat blockingProvider.log || true - cat dmlBlockingConsumer.log || true + cat log_sampleProvider.log || true + cat log_blockingProvider.log || true + cat log_dmlBlockingConsumer.log || true - name: Run RbusTestTimeoutValues Unit test run: | cd install/usr @@ -113,7 +113,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - nohup ./bin/multiRbusOpenRbusGetProvider >/tmp/log_multiRbusOpenRbusSetProvider.txt & + nohup ./bin/multiRbusOpenRbusSetProvider >/tmp/log_multiRbusOpenRbusSetProvider.txt & ./bin/multiRbusOpenRbusSetConsumer >/tmp/log_multiRbusOpenRbusSetConsumer.txt & - name: Run Gtest Cases run: | @@ -124,7 +124,7 @@ jobs: run: | cd ${{github.workspace}}/rbus for f in /tmp/logs*.txt; do - python noisylogdetector.py "$f" "/tmp/noisy_log_report_$(basename "$f" .txt).html" + python3 noisylogdetector.py "$f" "/tmp/noisy_log_report_$(basename "$f" .txt).html" done cd /tmp ls -l @@ -136,7 +136,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - nohup ./bin/rtrouted_diag shutdown + ./bin/rtrouted_diag shutdown - name: Upload the noisy log report to Pull request using actions uses: actions/upload-artifact@v4 with: diff --git a/noisylogdetector.py b/noisylogdetector.py index bd555dda..9a319b70 100644 --- a/noisylogdetector.py +++ b/noisylogdetector.py @@ -2,14 +2,26 @@ import re import sys import yaml -from collections import defaultdict from html import escape from pathlib import Path # ----------------------------- def load_rules(path="rules.yml"): - with open(path, "r") as f: - return yaml.safe_load(f) + try: + with open(path, "r") as f: + return yaml.safe_load(f) + except FileNotFoundError: + print(f"Rules file not found: {path}", file=sys.stderr) + sys.exit(1) + except PermissionError: + print(f"Permission denied while reading rules file: {path}", file=sys.stderr) + sys.exit(1) + except yaml.YAMLError as e: + print(f"Failed to parse YAML rules file '{path}': {e}", file=sys.stderr) + sys.exit(1) + except Exception as e: + print(f"Unexpected error while loading rules from '{path}': {e}", file=sys.stderr) + sys.exit(1) # ----------------------------- def starts_with_timestamp(line): @@ -43,7 +55,6 @@ def analyze(log_file, rules): public_api_res = compile_patterns(rules["public_api_patterns"]) sensitive_res = compile_patterns(rules["sensitive_patterns"]) failure_keywords = rules["failure_keywords"] - in_public_api = False active_public_api = None @@ -139,8 +150,8 @@ def write_section(title, rows): # ----------------------------- if __name__ == "__main__": - if len(sys.argv) < 2: - print("Usage: python3 noisy_log_detector.py ") + if len(sys.argv) < 3: + print("Usage: python3 noisylogdetector.py ") sys.exit(1) log_file = sys.argv[1] diff --git a/rules.yml b/rules.yml index 3cbfa291..4895f695 100644 --- a/rules.yml +++ b/rules.yml @@ -23,13 +23,13 @@ sensitive_patterns: - '-----BEGIN .*PRIVATE KEY-----' # URLs - - r'\bhttps?://[^\s]+' + - '\bhttps?://[^\s]+' # IP addresses - - r'\b(?:\d{1,3}\.){3}\d{1,3}\b' + - '\b(?:\d{1,3}\.){3}\d{1,3}\b' # MAC addresses - - r'\b([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})\b' + - '\b([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})\b' # Patterns that identify start of public API execution public_api_patterns: From 0767d22636c0d78dce70b717584804df2bd0b72c Mon Sep 17 00:00:00 2001 From: dshett549 Date: Thu, 22 Jan 2026 09:11:39 +0530 Subject: [PATCH 03/13] Address Copilot review comments Signed-off-by: dshett549 --- .github/workflows/log-quality-rules.yml | 41 ++--- noisylogdetector.py | 206 +++++++++++++++--------- rules.yml | 8 +- src/rbus/.rbus.c.swp | Bin 0 -> 16384 bytes src/rtmessage/rtLog.c | 2 +- 5 files changed, 152 insertions(+), 105 deletions(-) create mode 100644 src/rbus/.rbus.c.swp diff --git a/.github/workflows/log-quality-rules.yml b/.github/workflows/log-quality-rules.yml index a54f9ac0..2096d337 100644 --- a/.github/workflows/log-quality-rules.yml +++ b/.github/workflows/log-quality-rules.yml @@ -65,72 +65,75 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - nohup ./bin/rbusSampleProvider > log_sampleProvider.log 2>&1 & + nohup ./bin/rbusSampleProvider > /tmp/log_sampleProvider.log 2>&1 & sleep 1 - nohup stdbuf -oL -eL ./bin/rbusBlockingProvider > log_blockingProvider.log 2>&1 & + nohup stdbuf -oL -eL ./bin/rbusBlockingProvider > /tmp/log_blockingProvider.log 2>&1 & sleep 1 - ./bin/rbusDmlBlockingConsumer > log_dmlBlockingConsumer.log 2>&1 - cat log_sampleProvider.log || true - cat log_blockingProvider.log || true - cat log_dmlBlockingConsumer.log || true + ./bin/rbusDmlBlockingConsumer > /tmp/log_dmlBlockingConsumer.log 2>&1 + cat /tmp/log_sampleProvider.log || true + cat /tmp/log_blockingProvider.log || true + cat /tmp/log_dmlBlockingConsumer.log || true - name: Run RbusTestTimeoutValues Unit test run: | cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - nohup ./bin/rbusTestTimeoutValuesProvider > log_testTimeoutValuesProvider.txt & - ./bin/rbusTestTimeoutValuesConsumer > log_testTimeoutValuesConsumer.txt & + nohup ./bin/rbusTestTimeoutValuesProvider > /tmp/log_testTimeoutValuesProvider.txt & + ./bin/rbusTestTimeoutValuesConsumer > /tmp/log_testTimeoutValuesConsumer.txt - name: Run Unit test run: | cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib nohup ./bin/rbusTestProvider >/tmp/log_TestAppProvider.txt & - ./bin/rbusTestConsumer -a > /tmp/log_TestConsumer.txt & + ./bin/rbusTestConsumer -a > /tmp/log_TestConsumer.txt - name: Run multiRbusOpenMethod Unit Test run: | cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib ./bin/multiRbusOpenMethodProvider > /tmp/log_MultiRbusOpenMethodProvider.txt & - ./bin/multiRbusOpenMethodConsumer > /tmp/log_MultiRbusOpenMethodConsumer.txt& + ./bin/multiRbusOpenMethodConsumer > /tmp/log_MultiRbusOpenMethodConsumer.txt - name: Run multiRbusOpenSubscribe Unit test run: | cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib nohup ./bin/multiRbusOpenProvider >/tmp/log_multiRbusOpenProvider.txt & - ./bin/multiRbusOpenConsumer >/tmp/log_multiRbusOpenConsumer.txt & + ./bin/multiRbusOpenConsumer >/tmp/log_multiRbusOpenConsumer.txt - name: Run multiRbusOpenGet Unit test run: | cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib nohup ./bin/multiRbusOpenRbusGetProvider >/tmp/log_multiRbusOpenRbusGetProvider.txt & - ./bin/multiRbusOpenRbusGetConsumer >/tmp/log_multiRbusOpenRbusGetConsumer.txt & + ./bin/multiRbusOpenRbusGetConsumer >/tmp/log_multiRbusOpenRbusGetConsumer.txt - name: Run multiRbusOpenSet Unit test run: | cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib nohup ./bin/multiRbusOpenRbusSetProvider >/tmp/log_multiRbusOpenRbusSetProvider.txt & - ./bin/multiRbusOpenRbusSetConsumer >/tmp/log_multiRbusOpenRbusSetConsumer.txt & + ./bin/multiRbusOpenRbusSetConsumer >/tmp/log_multiRbusOpenRbusSetConsumer.txt - name: Run Gtest Cases run: | cd build/rbus nohup ./src/session_manager/rbus_session_mgr & - ./unittests/rbus_gtest.bin > /tmp/logs.txt & + ./unittests/rbus_gtest.bin > /tmp/log_gtestlogs.txt - name: Analyze logs run: | cd ${{github.workspace}}/rbus - for f in /tmp/logs*.txt; do + set -- /tmp/log_*.txt + if [ ! -e "$1" ]; then + echo "No log files found matching /tmp/log_*.txt, skipping log analysis." + else + for f in "$@"; do python3 noisylogdetector.py "$f" "/tmp/noisy_log_report_$(basename "$f" .txt).html" - done - cd /tmp - ls -l + done + fi - name: Stop SessionManager run: | - killall -15 rbus_session_mgr + killall -15 rbus_session_mgr || true - name: Stop rtrouted run: | cd install/usr diff --git a/noisylogdetector.py b/noisylogdetector.py index 9a319b70..a3d35d7f 100644 --- a/noisylogdetector.py +++ b/noisylogdetector.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 + import re import sys import yaml @@ -24,7 +25,22 @@ def load_rules(path="rules.yml"): sys.exit(1) # ----------------------------- -def starts_with_timestamp(line): +def validate_rules(rules): + required_keys = [ + "public_api_patterns", + "sensitive_patterns", + "noisy_log_levels", + "failure_keywords", + "required_severity_on_failure" + ] + for key in required_keys: + if key not in rules or not isinstance(rules[key], list): + print(f"Rules file missing or invalid key: '{key}'", file=sys.stderr) + sys.exit(1) + # Do not check for public_api_end_patterns + +# ----------------------------- +def starts_with_date_and_timestamp(line): """ Matches: 04:31:14.109764 @@ -32,7 +48,7 @@ def starts_with_timestamp(line): Nov 11 04:31:14 """ return bool(re.match( - r'^\s*(\d{2}:\d{2}:\d{2}\.\d+|\d{4}-\d{2}-\d{2}|\w{3}\s+\d+\s+\d{2}:\d{2}:\d{2})', + r'^\s*(\d{2}:\d{2}:\d{2}\.\d+|\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\.\d+|\w{3}\s+\d+\s+\d{2}:\d{2}:\d{2})', line )) @@ -47,72 +63,103 @@ def compile_patterns(patterns): return [re.compile(p, re.IGNORECASE) for p in patterns] # ----------------------------- -def analyze(log_file, rules): - noisy_logs = [] - sensitive_logs = [] - severity_violations = [] - +def detect_public_api_context(lines, rules): public_api_res = compile_patterns(rules["public_api_patterns"]) - sensitive_res = compile_patterns(rules["sensitive_patterns"]) - failure_keywords = rules["failure_keywords"] + # Do not use public_api_end_patterns + context = [] in_public_api = False active_public_api = None - - with open(log_file, "r", errors="ignore") as f: - for ln, line in enumerate(f, 1): - line = line.rstrip() - - if not starts_with_timestamp(line): - continue - - level = detect_level(line) - - # ----------------- Detect public API start + for ln, line in lines: + # Detect API start + for r in public_api_res: + m = r.search(line) + if m: + in_public_api = True + active_public_api = m.group(0) + break + # End API context if another API start is detected (reset context) + if in_public_api: for r in public_api_res: m = r.search(line) - if m: + if m and active_public_api not in line: in_public_api = True active_public_api = m.group(0) break + context.append((ln, line, in_public_api, active_public_api)) + return context - # ----------------- Noisy logs - if in_public_api: - if active_public_api not in line: - if level in rules["noisy_log_levels"]: - noisy_logs.append({ - "line": ln, - "level": level, - "log": line, - "reason": f"Internal log during public API execution ({active_public_api})" - }) - - # ----------------- Sensitive logs - for r in sensitive_res: - if r.search(line): - sensitive_logs.append({ - "line": ln, - "log": line, - "reason": "Sensitive / PII data detected" - }) - break - - # ----------------- Severity enforcement - if any(k in line.lower() for k in failure_keywords): - if level not in rules["required_severity_on_failure"]: - severity_violations.append({ - "line": ln, - "level": level, - "log": line, - "reason": "Failure logged without ERROR/WARN" - }) - +def find_noisy_logs(context, rules): + noisy_logs = [] + for ln, line, in_public_api, active_public_api in context: + level = detect_level(line) + if in_public_api and active_public_api and active_public_api not in line: + if level in rules["noisy_log_levels"]: + noisy_logs.append({ + "line": ln, + "level": level, + "log": line, + "reason": f"Internal log during public API execution ({active_public_api})" + }) + return noisy_logs + +def find_sensitive_logs(lines, rules): + sensitive_res = compile_patterns(rules["sensitive_patterns"]) + sensitive_logs = [] + for ln, line in lines: + for r in sensitive_res: + if r.search(line): + sensitive_logs.append({ + "line": ln, + "log": line, + "reason": "Sensitive / PII data detected" + }) + break + return sensitive_logs + +def find_severity_violations(lines, rules): + failure_keywords = rules["failure_keywords"] + severity_violations = [] + for ln, line in lines: + level = detect_level(line) + if any(k in line.lower() for k in failure_keywords): + if level not in rules["required_severity_on_failure"]: + severity_violations.append({ + "line": ln, + "level": level, + "log": line, + "reason": "Failure logged without ERROR/WARN" + }) + return severity_violations +def analyze(log_file, rules): + lines = [] + try: + with open(log_file, "r", errors="ignore") as f: + for ln, line in enumerate(f, 1): + line = line.rstrip() + if not starts_with_date_and_timestamp(line): + continue + lines.append((ln, line)) + except FileNotFoundError: + print(f"Log file not found: {log_file}", file=sys.stderr) + sys.exit(1) + except PermissionError: + print(f"Permission denied when reading log file: {log_file}", file=sys.stderr) + sys.exit(1) + except OSError as e: + print(f"Error reading log file {log_file}: {e}", file=sys.stderr) + sys.exit(1) + context = detect_public_api_context(lines, rules) + noisy_logs = find_noisy_logs(context, rules) + sensitive_logs = find_sensitive_logs(lines, rules) + severity_violations = find_severity_violations(lines, rules) return noisy_logs, sensitive_logs, severity_violations # ----------------------------- def generate_html(noisy, sensitive, severity, output): - with open(output, "w", encoding="utf-8") as f: - f.write(""" + try: + with open(output, "w", encoding="utf-8") as f: + f.write(""" Log Quality Report @@ -127,40 +174,43 @@ def generate_html(noisy, sensitive, severity, output):

Log Quality Report

""") - def write_section(title, rows): - f.write(f"

{title}

") - f.write("") - f.write("") - for r in rows: - f.write( - f"" - f"" - f"" - ) - f.write("
LineReasonLog
{r['line']}{escape(r['reason'])}{escape(r['log'])}
") - - write_section("Noisy Logs", noisy) - write_section("Sensitive / PII Logs", sensitive) - write_section("Severity Violations", severity) - - f.write("") - - print(f"Report generated: {output}") + def write_section(title, rows): + if not rows: + f.write(f"

{title}

") + f.write("

No issues found.

") + return + f.write(f"

{title}

") + f.write("") + f.write("") + for r in rows: + f.write( + f"" + f"" + f"" + ) + f.write("
LineReasonLog
{r['line']}{escape(r['reason'])}{escape(r['log'])}
") + + write_section("Noisy Logs", noisy) + write_section("Sensitive / PII Logs", sensitive) + write_section("Severity Violations", severity) + + f.write("") + print(f"Report generated: {output}") + except Exception as e: + print(f"Failed to write HTML report to '{output}': {e}", file=sys.stderr) + sys.exit(1) # ----------------------------- if __name__ == "__main__": - if len(sys.argv) < 3: - print("Usage: python3 noisylogdetector.py ") + print("Usage: python3 noisylogdetector.py (requires rules.yml in the current directory)") sys.exit(1) - log_file = sys.argv[1] output = sys.argv[2] - if not Path(log_file).exists(): print(f"Log file not found: {log_file}") sys.exit(1) - rules = load_rules() + validate_rules(rules) noisy, sensitive, severity = analyze(log_file, rules) generate_html(noisy, sensitive, severity, output) diff --git a/rules.yml b/rules.yml index 4895f695..5ba06eea 100644 --- a/rules.yml +++ b/rules.yml @@ -26,7 +26,7 @@ sensitive_patterns: - '\bhttps?://[^\s]+' # IP addresses - - '\b(?:\d{1,3}\.){3}\d{1,3}\b' + - '\b(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)\b' # MAC addresses - '\b([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})\b' @@ -35,12 +35,6 @@ sensitive_patterns: public_api_patterns: - 'rbus\.c' -# Patterns for internal logs that are considered noisy during public API -#internal_log_patterns: -# - r'\binternal_api\b' -# - r'\bdebug_internal\b' -# - r'\bhelper_function\b' - # Log levels considered noisy noisy_log_levels: - DEBUG diff --git a/src/rbus/.rbus.c.swp b/src/rbus/.rbus.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..b90bb0d60c4eea6d3383a31cad11a1b8ec270d0b GIT binary patch literal 16384 zcmeHNdypeV9S(}}MtO)(iq)4bAX&1TY&N&MxA)NOX7)B*9#=_rkHv#9n{=`x$xN7; z+}?VgqJL;1Sd?X1mhz`kT9k@a7NwR|pdt?uMZpK4@(|@Ef*^Q$2>A8PZ+0`ix#dd! zqH3n<%Ow5v@6lg(db&GVOw4EVY+^VW!u9S@=;?2_waZc`hdzBqC{*XXV=rlf+3=!z zL-U$xch%OEvA=)yk5k3CZFIC+)m-daap%P{YwjEIX}H$kIw%bk2o!j83Y-!eO^zgl zkAd(ecE;&*Z_Zs{9Viee5GW8R5GW8R5GW8R5GW8R@Rm}*?o5R~fsEfqSzk)`W2F1* zbTz5`GKqhU_%@Z_F7dAt@9j8}6u^t~U*fA|_Zf+Qg?LW<6B2)z_>U34iyGwl{}1u| zh`&?f|1I&`-|klQ><$iWI_{)j^ip0M}yw|?N68}%)J^ici z@cVyJ@_&cKzd(GB;-CLczx_Xm_xjJ2_~(f)k^LhQ{~Ymk;zy42`~N%fE#ki@@y`

XFL-r3z{A0v>`dxIg-~Lf4{>>8q2=N;E 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 MKYH{VgsWrxe~u5K1poj5 literal 0 HcmV?d00001 diff --git a/src/rtmessage/rtLog.c b/src/rtmessage/rtLog.c index 83b884b6..ec7cef7d 100644 --- a/src/rtmessage/rtLog.c +++ b/src/rtmessage/rtLog.c @@ -59,7 +59,7 @@ static const char* rtLogLevelStrings[] = }; static rtLogHandler sLogHandler = NULL; -static rtLogLevel sLevel = RT_LOG_INFO; +static rtLogLevel sLevel = RT_LOG_WARN; static rtLoggerSelection sOption = #ifdef ENABLE_RDKLOGGER RT_USE_RDKLOGGER; From 07da576b4074264ca87531e75c99ec152ff4ed2f Mon Sep 17 00:00:00 2001 From: dshett549 Date: Thu, 22 Jan 2026 09:47:49 +0530 Subject: [PATCH 04/13] Address Copilot review comments Signed-off-by: dshett549 --- .github/workflows/log-quality-rules.yml | 4 ++-- noisylogdetector.py | 30 +++++++++++++------------ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/.github/workflows/log-quality-rules.yml b/.github/workflows/log-quality-rules.yml index 2096d337..a425eec8 100644 --- a/.github/workflows/log-quality-rules.yml +++ b/.github/workflows/log-quality-rules.yml @@ -10,7 +10,7 @@ jobs: steps: - name: Set up cache id: cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | build @@ -113,7 +113,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - nohup ./bin/multiRbusOpenRbusSetProvider >/tmp/log_multiRbusOpenRbusSetProvider.txt & + nohup ./bin/multiRbusOpenRbusGetProvider >/tmp/log_multiRbusOpenRbusGetProvider_1.txt & ./bin/multiRbusOpenRbusSetConsumer >/tmp/log_multiRbusOpenRbusSetConsumer.txt - name: Run Gtest Cases run: | diff --git a/noisylogdetector.py b/noisylogdetector.py index a3d35d7f..516ea885 100644 --- a/noisylogdetector.py +++ b/noisylogdetector.py @@ -37,7 +37,7 @@ def validate_rules(rules): if key not in rules or not isinstance(rules[key], list): print(f"Rules file missing or invalid key: '{key}'", file=sys.stderr) sys.exit(1) - # Do not check for public_api_end_patterns + # End patterns intentionally not checked: API context continues until next API call. # ----------------------------- def starts_with_date_and_timestamp(line): @@ -65,34 +65,36 @@ def compile_patterns(patterns): # ----------------------------- def detect_public_api_context(lines, rules): public_api_res = compile_patterns(rules["public_api_patterns"]) - # Do not use public_api_end_patterns context = [] in_public_api = False active_public_api = None for ln, line in lines: - # Detect API start + found_api = None for r in public_api_res: m = r.search(line) if m: - in_public_api = True - active_public_api = m.group(0) + found_api = m.group(0) break - # End API context if another API start is detected (reset context) - if in_public_api: - for r in public_api_res: - m = r.search(line) - if m and active_public_api not in line: - in_public_api = True - active_public_api = m.group(0) - break + if found_api: + in_public_api = True + active_public_api = found_api + elif not found_api and in_public_api: + # Remain in API context until next API call + pass + else: + in_public_api = False + active_public_api = None context.append((ln, line, in_public_api, active_public_api)) return context def find_noisy_logs(context, rules): noisy_logs = [] + public_api_res = compile_patterns(rules["public_api_patterns"]) for ln, line, in_public_api, active_public_api in context: level = detect_level(line) - if in_public_api and active_public_api and active_public_api not in line: + # A log is noisy if we're in a public API context and the line does NOT start a new API call + is_api_start = any(r.search(line) for r in public_api_res) + if in_public_api and not is_api_start: if level in rules["noisy_log_levels"]: noisy_logs.append({ "line": ln, From 06d7f306a9282d1d98d8b0a7f0cb5a5a34b466d1 Mon Sep 17 00:00:00 2001 From: dshett549 Date: Thu, 22 Jan 2026 10:40:35 +0530 Subject: [PATCH 05/13] Address Copilot review comments Signed-off-by: dshett549 --- .github/workflows/log-quality-rules.yml | 5 ++-- noisylogdetector.py | 31 ++++++++++++++++++------- rules.yml | 2 +- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/.github/workflows/log-quality-rules.yml b/.github/workflows/log-quality-rules.yml index a425eec8..fba7fa53 100644 --- a/.github/workflows/log-quality-rules.yml +++ b/.github/workflows/log-quality-rules.yml @@ -28,7 +28,7 @@ jobs: sudo apt update && sudo apt install -y libcurl4-openssl-dev libgtest-dev lcov gcovr libmsgpack* libcjson-dev build-essential - name: Checkout rbus if: steps.cache.outputs.cache-hit != 'true' - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: rbus - name: Install dependencies @@ -113,7 +113,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - nohup ./bin/multiRbusOpenRbusGetProvider >/tmp/log_multiRbusOpenRbusGetProvider_1.txt & + nohup ./bin/multiRbusOpenRbusGetProvider >/tmp/log_multiRbusOpenRbusSetProvider.txt & ./bin/multiRbusOpenRbusSetConsumer >/tmp/log_multiRbusOpenRbusSetConsumer.txt - name: Run Gtest Cases run: | @@ -126,6 +126,7 @@ jobs: set -- /tmp/log_*.txt if [ ! -e "$1" ]; then echo "No log files found matching /tmp/log_*.txt, skipping log analysis." + exit 1 else for f in "$@"; do python3 noisylogdetector.py "$f" "/tmp/noisy_log_report_$(basename "$f" .txt).html" diff --git a/noisylogdetector.py b/noisylogdetector.py index 516ea885..7caa0d9f 100644 --- a/noisylogdetector.py +++ b/noisylogdetector.py @@ -64,6 +64,18 @@ def compile_patterns(patterns): # ----------------------------- def detect_public_api_context(lines, rules): + """ + Determines the public API context for each log line. + + Args: + lines: List of (line_number, line_text) tuples. + rules: Rules dictionary containing 'public_api_patterns'. + + Returns: + List of tuples: (line_number, line_text, in_public_api, active_public_api) + - in_public_api: True if the line is within a public API context, else False. + - active_public_api: The matched API pattern string if in context, else None. + """ public_api_res = compile_patterns(rules["public_api_patterns"]) context = [] in_public_api = False @@ -92,16 +104,16 @@ def find_noisy_logs(context, rules): public_api_res = compile_patterns(rules["public_api_patterns"]) for ln, line, in_public_api, active_public_api in context: level = detect_level(line) - # A log is noisy if we're in a public API context and the line does NOT start a new API call is_api_start = any(r.search(line) for r in public_api_res) if in_public_api and not is_api_start: if level in rules["noisy_log_levels"]: - noisy_logs.append({ - "line": ln, - "level": level, - "log": line, - "reason": f"Internal log during public API execution ({active_public_api})" - }) + if active_public_api and active_public_api != "rbus.c": + noisy_logs.append({ + "line": ln, + "level": level, + "log": line, + "reason": f"Internal log during public API execution ({active_public_api})" + }) return noisy_logs def find_sensitive_logs(lines, rules): @@ -205,7 +217,10 @@ def write_section(title, rows): # ----------------------------- if __name__ == "__main__": if len(sys.argv) < 3: - print("Usage: python3 noisylogdetector.py (requires rules.yml in the current directory)") + print( + "Usage: python3 noisylogdetector.py \n" + "Note: requires rules.yml in the current directory." + ) sys.exit(1) log_file = sys.argv[1] output = sys.argv[2] diff --git a/rules.yml b/rules.yml index 5ba06eea..440e5d52 100644 --- a/rules.yml +++ b/rules.yml @@ -5,7 +5,7 @@ # Patterns to detect sensitive information sensitive_patterns: # JWT tokens - - '(?i)\btoken\s*[:=]\s*[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\b' + - '(?i)\btoken\s*[:=]\s*[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b' # API keys - '(?i)\b(api[_-]?key|apikey)\s*[:=]\s*[A-Za-z0-9]{20,}\b' From e3a49aba1d43bc9284afd82dd7b24498ebb96174 Mon Sep 17 00:00:00 2001 From: dshett549 Date: Thu, 22 Jan 2026 11:10:01 +0530 Subject: [PATCH 06/13] Address Copilot review comments Signed-off-by: dshett549 --- .github/workflows/log-quality-rules.yml | 4 +- noisylogdetector.py | 217 +++++++++--------------- rules.yml | 2 +- 3 files changed, 80 insertions(+), 143 deletions(-) diff --git a/.github/workflows/log-quality-rules.yml b/.github/workflows/log-quality-rules.yml index fba7fa53..24db1f64 100644 --- a/.github/workflows/log-quality-rules.yml +++ b/.github/workflows/log-quality-rules.yml @@ -5,7 +5,7 @@ on: pull_request: branches: [ main, develop, release, support/*, hotfix/*, topic/* ] jobs: - all: + log-quality-check: runs-on: ubuntu-22.04 steps: - name: Set up cache @@ -126,7 +126,7 @@ jobs: set -- /tmp/log_*.txt if [ ! -e "$1" ]; then echo "No log files found matching /tmp/log_*.txt, skipping log analysis." - exit 1 + exit 0 else for f in "$@"; do python3 noisylogdetector.py "$f" "/tmp/noisy_log_report_$(basename "$f" .txt).html" diff --git a/noisylogdetector.py b/noisylogdetector.py index 7caa0d9f..d4bb80e3 100644 --- a/noisylogdetector.py +++ b/noisylogdetector.py @@ -24,21 +24,6 @@ def load_rules(path="rules.yml"): print(f"Unexpected error while loading rules from '{path}': {e}", file=sys.stderr) sys.exit(1) -# ----------------------------- -def validate_rules(rules): - required_keys = [ - "public_api_patterns", - "sensitive_patterns", - "noisy_log_levels", - "failure_keywords", - "required_severity_on_failure" - ] - for key in required_keys: - if key not in rules or not isinstance(rules[key], list): - print(f"Rules file missing or invalid key: '{key}'", file=sys.stderr) - sys.exit(1) - # End patterns intentionally not checked: API context continues until next API call. - # ----------------------------- def starts_with_date_and_timestamp(line): """ @@ -63,117 +48,71 @@ def compile_patterns(patterns): return [re.compile(p, re.IGNORECASE) for p in patterns] # ----------------------------- -def detect_public_api_context(lines, rules): - """ - Determines the public API context for each log line. - - Args: - lines: List of (line_number, line_text) tuples. - rules: Rules dictionary containing 'public_api_patterns'. +def analyze(log_file, rules): + noisy_logs = [] + sensitive_logs = [] + severity_violations = [] - Returns: - List of tuples: (line_number, line_text, in_public_api, active_public_api) - - in_public_api: True if the line is within a public API context, else False. - - active_public_api: The matched API pattern string if in context, else None. - """ public_api_res = compile_patterns(rules["public_api_patterns"]) - context = [] + sensitive_res = compile_patterns(rules["sensitive_patterns"]) + failure_keywords = rules["failure_keywords"] in_public_api = False active_public_api = None - for ln, line in lines: - found_api = None - for r in public_api_res: - m = r.search(line) - if m: - found_api = m.group(0) - break - if found_api: - in_public_api = True - active_public_api = found_api - elif not found_api and in_public_api: - # Remain in API context until next API call - pass - else: - in_public_api = False - active_public_api = None - context.append((ln, line, in_public_api, active_public_api)) - return context - -def find_noisy_logs(context, rules): - noisy_logs = [] - public_api_res = compile_patterns(rules["public_api_patterns"]) - for ln, line, in_public_api, active_public_api in context: - level = detect_level(line) - is_api_start = any(r.search(line) for r in public_api_res) - if in_public_api and not is_api_start: - if level in rules["noisy_log_levels"]: - if active_public_api and active_public_api != "rbus.c": - noisy_logs.append({ + + with open(log_file, "r", errors="ignore") as f: + for ln, line in enumerate(f, 1): + line = line.rstrip() + + if not starts_with_timestamp(line): + continue + + level = detect_level(line) + + # ----------------- Detect public API start + for r in public_api_res: + m = r.search(line) + if m: + in_public_api = True + active_public_api = m.group(0) + break + + # ----------------- Noisy logs + if in_public_api: + if active_public_api not in line: + if level in rules["noisy_log_levels"]: + noisy_logs.append({ + "line": ln, + "level": level, + "log": line, + "reason": f"Internal log during public API execution ({active_public_api})" + }) + + # ----------------- Sensitive logs + for r in sensitive_res: + if r.search(line): + sensitive_logs.append({ "line": ln, - "level": level, "log": line, - "reason": f"Internal log during public API execution ({active_public_api})" + "reason": "Sensitive / PII data detected" }) - return noisy_logs + break -def find_sensitive_logs(lines, rules): - sensitive_res = compile_patterns(rules["sensitive_patterns"]) - sensitive_logs = [] - for ln, line in lines: - for r in sensitive_res: - if r.search(line): - sensitive_logs.append({ - "line": ln, - "log": line, - "reason": "Sensitive / PII data detected" - }) - break - return sensitive_logs - -def find_severity_violations(lines, rules): - failure_keywords = rules["failure_keywords"] - severity_violations = [] - for ln, line in lines: - level = detect_level(line) - if any(k in line.lower() for k in failure_keywords): - if level not in rules["required_severity_on_failure"]: - severity_violations.append({ - "line": ln, - "level": level, - "log": line, - "reason": "Failure logged without ERROR/WARN" - }) - return severity_violations + # ----------------- Severity enforcement + if any(k in line.lower() for k in failure_keywords): + if level not in rules["required_severity_on_failure"]: + severity_violations.append({ + "line": ln, + "level": level, + "log": line, + "reason": "Failure logged without ERROR/WARN" + }) -def analyze(log_file, rules): - lines = [] - try: - with open(log_file, "r", errors="ignore") as f: - for ln, line in enumerate(f, 1): - line = line.rstrip() - if not starts_with_date_and_timestamp(line): - continue - lines.append((ln, line)) - except FileNotFoundError: - print(f"Log file not found: {log_file}", file=sys.stderr) - sys.exit(1) - except PermissionError: - print(f"Permission denied when reading log file: {log_file}", file=sys.stderr) - sys.exit(1) - except OSError as e: - print(f"Error reading log file {log_file}: {e}", file=sys.stderr) - sys.exit(1) - context = detect_public_api_context(lines, rules) - noisy_logs = find_noisy_logs(context, rules) - sensitive_logs = find_sensitive_logs(lines, rules) - severity_violations = find_severity_violations(lines, rules) return noisy_logs, sensitive_logs, severity_violations # ----------------------------- def generate_html(noisy, sensitive, severity, output): - try: - with open(output, "w", encoding="utf-8") as f: - f.write(""" + with open(output, "w", encoding="utf-8") as f: + f.write(""" Log Quality Report @@ -188,46 +127,44 @@ def generate_html(noisy, sensitive, severity, output):

Log Quality Report

""") - def write_section(title, rows): - if not rows: - f.write(f"

{title}

") - f.write("

No issues found.

") - return - f.write(f"

{title}

") - f.write("") - f.write("") - for r in rows: - f.write( - f"" - f"" - f"" - ) - f.write("
LineReasonLog
{r['line']}{escape(r['reason'])}{escape(r['log'])}
") - - write_section("Noisy Logs", noisy) - write_section("Sensitive / PII Logs", sensitive) - write_section("Severity Violations", severity) - - f.write("") - print(f"Report generated: {output}") - except Exception as e: - print(f"Failed to write HTML report to '{output}': {e}", file=sys.stderr) - sys.exit(1) + def write_section(title, rows): + f.write(f"

{title}

") + f.write("") + f.write("") + for r in rows: + f.write( + f"" + f"" + f"" + ) + f.write("
LineReasonLog
{r['line']}{escape(r['reason'])}{escape(r['log'])}
") + + write_section("Noisy Logs", noisy) + write_section("Sensitive / PII Logs", sensitive) + write_section("Severity Violations", severity) + + f.write("") + + print(f"Report generated: {output}") # ----------------------------- if __name__ == "__main__": + if len(sys.argv) < 3: print( "Usage: python3 noisylogdetector.py \n" - "Note: requires rules.yml in the current directory." + "Note: requires rules.yml in the current working directory." ) + sys.exit(1) + log_file = sys.argv[1] output = sys.argv[2] + if not Path(log_file).exists(): print(f"Log file not found: {log_file}") sys.exit(1) + rules = load_rules() - validate_rules(rules) noisy, sensitive, severity = analyze(log_file, rules) generate_html(noisy, sensitive, severity, output) diff --git a/rules.yml b/rules.yml index 440e5d52..03092424 100644 --- a/rules.yml +++ b/rules.yml @@ -20,7 +20,7 @@ sensitive_patterns: - '\bAKIA[0-9A-Z]{16}\b' # Private key blocks - - '-----BEGIN .*PRIVATE KEY-----' + - '-----BEGIN .*PRIVATE KEY-----[\s\S]*?-----END .*PRIVATE KEY-----' # URLs - '\bhttps?://[^\s]+' From 52395d9b95c9e06cfafdcd65ae5aebd2310c1db6 Mon Sep 17 00:00:00 2001 From: dshett549 Date: Thu, 22 Jan 2026 11:43:42 +0530 Subject: [PATCH 07/13] Address Copilot review comments Signed-off-by: dshett549 --- noisylogdetector.py | 58 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/noisylogdetector.py b/noisylogdetector.py index d4bb80e3..e3af7b28 100644 --- a/noisylogdetector.py +++ b/noisylogdetector.py @@ -33,7 +33,7 @@ def starts_with_date_and_timestamp(line): Nov 11 04:31:14 """ return bool(re.match( - r'^\s*(\d{2}:\d{2}:\d{2}\.\d+|\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\.\d+|\w{3}\s+\d+\s+\d{2}:\d{2}:\d{2})', + r'^\s*(\d{2}:\d{2}:\d{2}\.\d+|\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\.\d+|(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})', line )) @@ -49,6 +49,43 @@ def compile_patterns(patterns): # ----------------------------- def analyze(log_file, rules): + """ + Analyze a log file for noisy logging, sensitive data exposure, and + incorrect severity usage based on the provided rules. + Parameters + ---------- + log_file : str or pathlib.Path + Path to the log file to analyze. The file is opened in text mode + with errors ignored to allow processing partially invalid encodings. + rules : dict + Configuration dictionary containing analysis rules. Expected keys: + - "public_api_patterns": list of regex patterns that identify when + a public API call starts. + - "sensitive_patterns": list of regex patterns that match sensitive + or PII data that must not appear in logs. + - "failure_keywords": list of lowercase keywords that indicate a + failure or error condition in a log line. + - "noisy_log_levels": iterable of log levels (e.g. "INFO", "DEBUG") + that are considered noisy when emitted during a public API call. + - "required_severity_on_failure": iterable of log levels (e.g. + "ERROR", "WARN") that must be used when a failure keyword is + present. + Returns + ------- + tuple + A 3-tuple `(noisy_logs, sensitive_logs, severity_violations)` where + each element is a list of dictionaries describing matching log lines. + - noisy_logs: entries for internal/noisy logs emitted while a public + API is considered active. Each dict contains: + - "line": line number (1-based) in the log file. + - "level": detected log level. + - "log": the full log line. + - "reason": human-readable explanation. + - sensitive_logs: entries where sensitive or PII data was detected, + with similar structure ("line", "log", "reason"). + - severity_violations: entries where a failure keyword was found but + the log level did not meet the required severity. + """ noisy_logs = [] sensitive_logs = [] severity_violations = [] @@ -63,7 +100,7 @@ def analyze(log_file, rules): for ln, line in enumerate(f, 1): line = line.rstrip() - if not starts_with_timestamp(line): + if not starts_with_date_and_timestamp(line): continue level = detect_level(line) @@ -82,7 +119,6 @@ def analyze(log_file, rules): if level in rules["noisy_log_levels"]: noisy_logs.append({ "line": ln, - "level": level, "log": line, "reason": f"Internal log during public API execution ({active_public_api})" }) @@ -102,7 +138,6 @@ def analyze(log_file, rules): if level not in rules["required_severity_on_failure"]: severity_violations.append({ "line": ln, - "level": level, "log": line, "reason": "Failure logged without ERROR/WARN" }) @@ -131,12 +166,15 @@ def write_section(title, rows): f.write(f"

{title}

") f.write("") f.write("") - for r in rows: - f.write( - f"" - f"" - f"" - ) + if not rows: + f.write('') + else: + for r in rows: + f.write( + f"" + f"" + f"" + ) f.write("
LineReasonLog
{r['line']}{escape(r['reason'])}{escape(r['log'])}
No issues found in this section.
{r['line']}{escape(r['reason'])}{escape(r['log'])}
") write_section("Noisy Logs", noisy) From d2b0345f8281364410c37a97d6af2a2fd33a9eb8 Mon Sep 17 00:00:00 2001 From: dshett549 Date: Thu, 22 Jan 2026 11:44:28 +0530 Subject: [PATCH 08/13] Address Copilot review comments Signed-off-by: dshett549 --- noisylogdetector.py | 1 - 1 file changed, 1 deletion(-) diff --git a/noisylogdetector.py b/noisylogdetector.py index e3af7b28..64053d3d 100644 --- a/noisylogdetector.py +++ b/noisylogdetector.py @@ -78,7 +78,6 @@ def analyze(log_file, rules): - noisy_logs: entries for internal/noisy logs emitted while a public API is considered active. Each dict contains: - "line": line number (1-based) in the log file. - - "level": detected log level. - "log": the full log line. - "reason": human-readable explanation. - sensitive_logs: entries where sensitive or PII data was detected, From 39b48ba0e63a4bfd7084bd5faa41d37b53b0e468 Mon Sep 17 00:00:00 2001 From: dshett549 Date: Thu, 22 Jan 2026 12:01:55 +0530 Subject: [PATCH 09/13] Update log-quality.yml Signed-off-by: dshett549 --- .github/workflows/log-quality-rules.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/log-quality-rules.yml b/.github/workflows/log-quality-rules.yml index 24db1f64..d7255b4d 100644 --- a/.github/workflows/log-quality-rules.yml +++ b/.github/workflows/log-quality-rules.yml @@ -93,7 +93,7 @@ jobs: export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib ./bin/multiRbusOpenMethodProvider > /tmp/log_MultiRbusOpenMethodProvider.txt & - ./bin/multiRbusOpenMethodConsumer > /tmp/log_MultiRbusOpenMethodConsumer.txt + ./bin/multiRbusOpenMethodConsumer > /tmp/log_MultiRbusOpenMethodConsumer.txt & - name: Run multiRbusOpenSubscribe Unit test run: | cd install/usr From 4936d5857112a66ca14de3e690e216024ce1d61d Mon Sep 17 00:00:00 2001 From: dshett549 Date: Thu, 22 Jan 2026 12:28:09 +0530 Subject: [PATCH 10/13] Update noisy_log_detector.py Signed-off-by: dshett549 --- noisylogdetector.py | 4 +--- src/rbus/.rbus.c.swp | Bin 16384 -> 0 bytes 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 src/rbus/.rbus.c.swp diff --git a/noisylogdetector.py b/noisylogdetector.py index 64053d3d..0cde5f41 100644 --- a/noisylogdetector.py +++ b/noisylogdetector.py @@ -49,7 +49,7 @@ def compile_patterns(patterns): # ----------------------------- def analyze(log_file, rules): - """ + """ Analyze a log file for noisy logging, sensitive data exposure, and incorrect severity usage based on the provided rules. Parameters @@ -186,13 +186,11 @@ def write_section(title, rows): # ----------------------------- if __name__ == "__main__": - if len(sys.argv) < 3: print( "Usage: python3 noisylogdetector.py \n" "Note: requires rules.yml in the current working directory." ) - sys.exit(1) log_file = sys.argv[1] diff --git a/src/rbus/.rbus.c.swp b/src/rbus/.rbus.c.swp deleted file mode 100644 index b90bb0d60c4eea6d3383a31cad11a1b8ec270d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeHNdypeV9S(}}MtO)(iq)4bAX&1TY&N&MxA)NOX7)B*9#=_rkHv#9n{=`x$xN7; z+}?VgqJL;1Sd?X1mhz`kT9k@a7NwR|pdt?uMZpK4@(|@Ef*^Q$2>A8PZ+0`ix#dd! zqH3n<%Ow5v@6lg(db&GVOw4EVY+^VW!u9S@=;?2_waZc`hdzBqC{*XXV=rlf+3=!z zL-U$xch%OEvA=)yk5k3CZFIC+)m-daap%P{YwjEIX}H$kIw%bk2o!j83Y-!eO^zgl zkAd(ecE;&*Z_Zs{9Viee5GW8R5GW8R5GW8R5GW8R@Rm}*?o5R~fsEfqSzk)`W2F1* zbTz5`GKqhU_%@Z_F7dAt@9j8}6u^t~U*fA|_Zf+Qg?LW<6B2)z_>U34iyGwl{}1u| zh`&?f|1I&`-|klQ><$iWI_{)j^ip0M}yw|?N68}%)J^ici z@cVyJ@_&cKzd(GB;-CLczx_Xm_xjJ2_~(f)k^LhQ{~Ymk;zy42`~N%fE#ki@@y`

XFL-r3z{A0v>`dxIg-~Lf4{>>8q2=N;E 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 MKYH{VgsWrxe~u5K1poj5 From c3b616aa2a8695ec839eaec767e59930ad63f2b8 Mon Sep 17 00:00:00 2001 From: dshett549 Date: Thu, 22 Jan 2026 13:27:56 +0530 Subject: [PATCH 11/13] Update Noisy_log_detector.py Signed-off-by: dshett549 --- noisylogdetector.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/noisylogdetector.py b/noisylogdetector.py index 0cde5f41..b6c2bea1 100644 --- a/noisylogdetector.py +++ b/noisylogdetector.py @@ -27,13 +27,15 @@ def load_rules(path="rules.yml"): # ----------------------------- def starts_with_date_and_timestamp(line): """ - Matches: - 04:31:14.109764 - 2024-11-11 04:31:14.109 - Nov 11 04:31:14 + Matches log lines starting with any of the following timestamp patterns: + - HH:MM:SS or HH:MM:SS.ssssss (e.g. 04:31:14 or 04:31:14.109764) + - YYYY-MM-DD HH:MM:SS or YYYY-MM-DD HH:MM:SS.sss (e.g. 2024-11-11 04:31:14 or 2024-11-11 04:31:14.109) + - Mon DD HH:MM:SS (e.g. Nov 11 04:31:14) + Lines not matching these patterns at the start will be ignored. """ return bool(re.match( - r'^\s*(\d{2}:\d{2}:\d{2}\.\d+|\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\.\d+|(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})', + r'^\s*(\d{2}:\d{2}:\d{2}(?:\.\d+)?|\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}(?:\.\d+)?|' + r'(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})', line )) From 5bb01e469f05bf02d07f43bb6418532977abbc17 Mon Sep 17 00:00:00 2001 From: dshett549 Date: Thu, 22 Jan 2026 13:55:49 +0530 Subject: [PATCH 12/13] Enabled DEBUG logs to get noisy logs reported Signed-off-by: dshett549 --- .github/workflows/log-quality-rules.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/log-quality-rules.yml b/.github/workflows/log-quality-rules.yml index d7255b4d..91f434fb 100644 --- a/.github/workflows/log-quality-rules.yml +++ b/.github/workflows/log-quality-rules.yml @@ -65,6 +65,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib + export RT_LOG_LEVEL=debug nohup ./bin/rbusSampleProvider > /tmp/log_sampleProvider.log 2>&1 & sleep 1 nohup stdbuf -oL -eL ./bin/rbusBlockingProvider > /tmp/log_blockingProvider.log 2>&1 & @@ -78,6 +79,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib + export RT_LOG_LEVEL=debug nohup ./bin/rbusTestTimeoutValuesProvider > /tmp/log_testTimeoutValuesProvider.txt & ./bin/rbusTestTimeoutValuesConsumer > /tmp/log_testTimeoutValuesConsumer.txt - name: Run Unit test @@ -85,6 +87,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib + export RT_LOG_LEVEL=debug nohup ./bin/rbusTestProvider >/tmp/log_TestAppProvider.txt & ./bin/rbusTestConsumer -a > /tmp/log_TestConsumer.txt - name: Run multiRbusOpenMethod Unit Test @@ -92,6 +95,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib + export RT_LOG_LEVEL=debug ./bin/multiRbusOpenMethodProvider > /tmp/log_MultiRbusOpenMethodProvider.txt & ./bin/multiRbusOpenMethodConsumer > /tmp/log_MultiRbusOpenMethodConsumer.txt & - name: Run multiRbusOpenSubscribe Unit test @@ -99,6 +103,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib + export RT_LOG_LEVEL=debug nohup ./bin/multiRbusOpenProvider >/tmp/log_multiRbusOpenProvider.txt & ./bin/multiRbusOpenConsumer >/tmp/log_multiRbusOpenConsumer.txt - name: Run multiRbusOpenGet Unit test @@ -106,6 +111,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib + export RT_LOG_LEVEL=debug nohup ./bin/multiRbusOpenRbusGetProvider >/tmp/log_multiRbusOpenRbusGetProvider.txt & ./bin/multiRbusOpenRbusGetConsumer >/tmp/log_multiRbusOpenRbusGetConsumer.txt - name: Run multiRbusOpenSet Unit test @@ -113,11 +119,13 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib + export RT_LOG_LEVEL=debug nohup ./bin/multiRbusOpenRbusGetProvider >/tmp/log_multiRbusOpenRbusSetProvider.txt & ./bin/multiRbusOpenRbusSetConsumer >/tmp/log_multiRbusOpenRbusSetConsumer.txt - name: Run Gtest Cases run: | cd build/rbus + export RT_LOG_LEVEL=debug nohup ./src/session_manager/rbus_session_mgr & ./unittests/rbus_gtest.bin > /tmp/log_gtestlogs.txt - name: Analyze logs From b47ddfee14da992b9fe8c2a10aa279a2ecd1a5f6 Mon Sep 17 00:00:00 2001 From: dshett549 Date: Thu, 22 Jan 2026 14:03:44 +0530 Subject: [PATCH 13/13] changed loglevel to info Signed-off-by: dshett549 --- .github/workflows/log-quality-rules.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/log-quality-rules.yml b/.github/workflows/log-quality-rules.yml index 91f434fb..0a28cf5f 100644 --- a/.github/workflows/log-quality-rules.yml +++ b/.github/workflows/log-quality-rules.yml @@ -65,7 +65,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - export RT_LOG_LEVEL=debug + export RT_LOG_LEVEL=info nohup ./bin/rbusSampleProvider > /tmp/log_sampleProvider.log 2>&1 & sleep 1 nohup stdbuf -oL -eL ./bin/rbusBlockingProvider > /tmp/log_blockingProvider.log 2>&1 & @@ -79,7 +79,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - export RT_LOG_LEVEL=debug + export RT_LOG_LEVEL=info nohup ./bin/rbusTestTimeoutValuesProvider > /tmp/log_testTimeoutValuesProvider.txt & ./bin/rbusTestTimeoutValuesConsumer > /tmp/log_testTimeoutValuesConsumer.txt - name: Run Unit test @@ -87,7 +87,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - export RT_LOG_LEVEL=debug + export RT_LOG_LEVEL=info nohup ./bin/rbusTestProvider >/tmp/log_TestAppProvider.txt & ./bin/rbusTestConsumer -a > /tmp/log_TestConsumer.txt - name: Run multiRbusOpenMethod Unit Test @@ -95,7 +95,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - export RT_LOG_LEVEL=debug + export RT_LOG_LEVEL=info ./bin/multiRbusOpenMethodProvider > /tmp/log_MultiRbusOpenMethodProvider.txt & ./bin/multiRbusOpenMethodConsumer > /tmp/log_MultiRbusOpenMethodConsumer.txt & - name: Run multiRbusOpenSubscribe Unit test @@ -103,7 +103,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - export RT_LOG_LEVEL=debug + export RT_LOG_LEVEL=info nohup ./bin/multiRbusOpenProvider >/tmp/log_multiRbusOpenProvider.txt & ./bin/multiRbusOpenConsumer >/tmp/log_multiRbusOpenConsumer.txt - name: Run multiRbusOpenGet Unit test @@ -111,7 +111,7 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - export RT_LOG_LEVEL=debug + export RT_LOG_LEVEL=info nohup ./bin/multiRbusOpenRbusGetProvider >/tmp/log_multiRbusOpenRbusGetProvider.txt & ./bin/multiRbusOpenRbusGetConsumer >/tmp/log_multiRbusOpenRbusGetConsumer.txt - name: Run multiRbusOpenSet Unit test @@ -119,13 +119,13 @@ jobs: cd install/usr export PREFIX=$PWD export LD_LIBRARY_PATH=$PREFIX/lib - export RT_LOG_LEVEL=debug + export RT_LOG_LEVEL=info nohup ./bin/multiRbusOpenRbusGetProvider >/tmp/log_multiRbusOpenRbusSetProvider.txt & ./bin/multiRbusOpenRbusSetConsumer >/tmp/log_multiRbusOpenRbusSetConsumer.txt - name: Run Gtest Cases run: | cd build/rbus - export RT_LOG_LEVEL=debug + export RT_LOG_LEVEL=info nohup ./src/session_manager/rbus_session_mgr & ./unittests/rbus_gtest.bin > /tmp/log_gtestlogs.txt - name: Analyze logs