refactor(audit): 分离架构-监听器计算装饰器入库
This commit is contained in:
@ -301,23 +301,24 @@ def audit_log(module: str, action: str = None, get_target_id_fn=None, get_target
|
||||
# 默认:记录请求 Payload
|
||||
details = {'payload': filtered_payload}
|
||||
|
||||
# ★ 关键:检查是否已被底层监听器处理
|
||||
# 如果底层已生成高级日志(changes/deleted_snapshot),则跳过简单的 payload 日志
|
||||
from flask import g, has_request_context
|
||||
if has_request_context() and hasattr(g, 'audit_handled_ids') and g.audit_handled_ids:
|
||||
# 构建检查 key: "module:target_id"
|
||||
# ★ 核心重构:监听器计算,装饰器入库
|
||||
# 检查 g.audit_details 是否有底层监听器传递的高级日志
|
||||
if has_request_context() and hasattr(g, 'audit_details') and g.audit_details:
|
||||
check_key = f"{module}:{target_id}" if target_id else None
|
||||
if check_key and check_key in g.audit_handled_ids:
|
||||
# 底层已处理,跳过装饰器日志
|
||||
current_app.logger.info(f'[审计] 底层监听器已处理 {check_key},跳过装饰器')
|
||||
return response
|
||||
# 也检查 target_name 是否匹配
|
||||
for key in g.audit_handled_ids:
|
||||
if target_name and target_name in key:
|
||||
current_app.logger.info(f'[审计] 底层监听器已处理 {key},跳过装饰器')
|
||||
return response
|
||||
if check_key and check_key in g.audit_details:
|
||||
# 用底层的高级日志(changes/deleted_snapshot/created)替换 payload
|
||||
audit_info = g.audit_details[check_key]
|
||||
details = audit_info.get('details', details)
|
||||
current_app.logger.info(f'[审计] 底层监听器已计算 {check_key},使用高级日志')
|
||||
else:
|
||||
# 兼容 fallback:模糊匹配 target_name
|
||||
for key, audit_info in g.audit_details.items():
|
||||
if target_name and target_name in key:
|
||||
details = audit_info.get('details', details)
|
||||
current_app.logger.info(f'[审计] 底层监听器已计算 {key},使用高级日志')
|
||||
break
|
||||
|
||||
# 保存日志
|
||||
# 保存日志(统一入库)
|
||||
log_entry = AuditLog(
|
||||
user_id=user_id,
|
||||
username=username,
|
||||
|
||||
Reference in New Issue
Block a user