(20241209) Better session info capture in the logs.

This commit is contained in:
2024-12-09 12:04:38 +05:30
parent 4583a5e63c
commit 30088dcea4
5 changed files with 792 additions and 24 deletions
+30 -24
View File
@@ -26,7 +26,7 @@
DECORATORS.
"""
import copy
# *****************************************************************************************************************
# ***** ****
@@ -81,6 +81,9 @@ import asyncio
import time
import datetime
# To make copies:
import copy
# *****************************************************************************************************************
# ***** ****
@@ -374,55 +377,58 @@ def summarize_variable(
:return: The summarized version of the input.
"""
# If a null value was sent:
# Basic prep:
if value is None: return None
# Check the sensitive keys:
if sensitive_keys is None: sensitive_keys = []
value_copy = copy.deepcopy(value)
# If the value is a Pydantic model, we convert to dict:
if isinstance(value_copy, pydantic.BaseModel):
value_copy = value_copy.model_dump()
# Handle datatypes that you don't want to modify:
if isinstance(value, (int, float, bool, NoneType)): pass
if isinstance(value_copy, (int, float, bool, NoneType)): pass
# When the value is a list or similar iterable:
elif isinstance(value, (list, tuple, set)):
elif isinstance(value_copy, (list, tuple, set)):
if expand:
if not isinstance(expand, bool): expand -= 1
value = [AsyncLoggerContext.summarize(
value_copy = [AsyncLoggerContext.summarize(
v,
expand = expand,
sensitive_keys = sensitive_keys
) for v in value]
else: value = f"array of {len(value)} item(s)"
) for v in value_copy]
else: value_copy = f"array of {len(value_copy)} item(s)"
# If the value is a dict:
elif isinstance(value, dict):
elif isinstance(value_copy, dict):
if expand:
if not isinstance(expand, bool): expand -= 1
value = {
value_copy = {
k: AsyncLoggerContext.summarize(
v,
expand = expand,
sensitive_keys = sensitive_keys
) if k not in sensitive_keys else "********"
for k, v in value.items()
) if k not in sensitive_keys else f"{len(str(v))} sensitive char(s)"
for k, v in value_copy.items()
}
else: value = f"object of {len(value.keys())} field(s) [{', '.join(value.keys())}]"
else: value_copy = f"object of {len(value_copy.keys())} field(s) [{', '.join(value_copy.keys())}]"
# When a dataframe is passed:
elif isinstance(value, pd.DataFrame):
cols = value.columns.to_list()
value = f"table with {len(cols)} col(s) [{', '.join(cols)}] and {len(value)} row(s)"
str_limit = 999
elif isinstance(value_copy, pd.DataFrame):
cols = value_copy.columns.to_list()
value_copy = f"table with {len(cols)} col(s) [{', '.join(cols)}] and {len(value_copy)} row(s)"
str_limit = 1024
# If the input is some form of non-standard object:
else: value = str(value)
else: value_copy = str(value_copy)
# Handle strings:
if isinstance(value, str):
if len(value) > str_limit: value = value[:str_limit] + "..."
if isinstance(value_copy, str):
if len(value_copy) > str_limit: value_copy = value_copy[:str_limit] + "...(trunc'd)"
# Done here:
return value
return value_copy
# ---------------------------------------------------------------------------------------------------------------------
@@ -867,7 +873,7 @@ def log_request_to_mongo(
if sensitive_keys:
for k in sensitive_keys:
for var in ["inbound_headers", "inbound_data"]:
try: kwargs[var][k] = len(str(kwargs[var][k])) * "*"
try: kwargs[var][k] = f"{len(str(kwargs[var][k]))} sensitive char(s)"
except: pass
# Construct the log:
@@ -883,7 +889,7 @@ def log_request_to_mongo(
ts = request_ts,
tat = time.perf_counter() - start_ts,
cpuTime = time.process_time() - cpu_start_ts,
sessionInfo = kwargs.get("session_info"),
sessionInfo = summarize_variable(kwargs.get("session_info"), expand = True),
method = request_method,
url = request_url,
route = request_route,