|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
| 3 | +import hashlib |
3 | 4 | import json |
4 | 5 | import logging |
5 | 6 | import os |
@@ -47,17 +48,15 @@ def _try_loads_kv_value(raw: str | None) -> Any | None: |
47 | 48 | return None |
48 | 49 |
|
49 | 50 |
|
50 | | -_KV_VALUE_LOG_LIMIT = 200 |
51 | | - |
52 | | - |
53 | | -def _kv_value_log_preview(value: object | None, limit: int = _KV_VALUE_LOG_LIMIT) -> str: |
54 | | - """Truncated KV payload for warning logs (avoids multi-MB log lines on bad rows).""" |
| 51 | +def _kv_payload_log_meta(value: object | None) -> tuple[int, str | None]: |
| 52 | + """Byte length and short SHA-256 prefix for logs without emitting raw KV payloads.""" |
55 | 53 | if value is None: |
56 | | - return "None" |
57 | | - text = value if isinstance(value, str) else str(value) |
58 | | - if len(text) > limit: |
59 | | - return text[:limit] + "..." |
60 | | - return text |
| 54 | + return 0, None |
| 55 | + if isinstance(value, bytes): |
| 56 | + payload = value |
| 57 | + else: |
| 58 | + payload = str(value).encode("utf-8", errors="replace") |
| 59 | + return len(payload), hashlib.sha256(payload).hexdigest()[:12] |
61 | 60 |
|
62 | 61 |
|
63 | 62 | def assemble_workspace_tabs( |
@@ -128,12 +127,15 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list: |
128 | 127 | continue |
129 | 128 | try: |
130 | 129 | parsed = json.loads(row["value"]) |
| 130 | + |
131 | 131 | except (json.JSONDecodeError, TypeError, ValueError) as e: |
| 132 | + payload_len, payload_fp = _kv_payload_log_meta(row["value"]) |
132 | 133 | _logger.warning( |
133 | | - "Failed to decode Bubble from %s: %s (value_preview=%r)", |
| 134 | + "Failed to decode Bubble from %s: %s (payload_len=%d, payload_sha256=%s)", |
134 | 135 | row["key"], |
135 | 136 | e, |
136 | | - _kv_value_log_preview(row["value"]), |
| 137 | + payload_len, |
| 138 | + payload_fp, |
137 | 139 | ) |
138 | 140 | continue |
139 | 141 | try: |
@@ -213,12 +215,14 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list: |
213 | 215 | try: |
214 | 216 | parsed = json.loads(row["value"]) |
215 | 217 | except (json.JSONDecodeError, TypeError, ValueError) as e: |
| 218 | + payload_len, payload_fp = _kv_payload_log_meta(row["value"]) |
216 | 219 | _logger.warning( |
217 | | - "Failed to decode Composer from composerData:%s: %s (key=%s, value_preview=%r)", |
| 220 | + "Failed to decode Composer from composerData:%s: %s (key=%s, payload_len=%d, payload_sha256=%s)", |
218 | 221 | composer_id, |
219 | 222 | e, |
220 | 223 | row["key"], |
221 | | - _kv_value_log_preview(row["value"]), |
| 224 | + payload_len, |
| 225 | + payload_fp, |
222 | 226 | ) |
223 | 227 | continue |
224 | 228 | try: |
|
0 commit comments