From decb7f5e1fa8d293ab9f3526b1e7dab08b33975e Mon Sep 17 00:00:00 2001 From: DXC Date: Mon, 20 Apr 2026 15:01:20 +0800 Subject: [PATCH] =?UTF-8?q?debug(audit):=20=E6=B7=BB=E5=8A=A0X=E5=85=89?= =?UTF-8?q?=E8=B0=83=E8=AF=95-=E8=BF=BD=E8=B8=AA=E6=96=AD=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inventory-backend/app/core/audit_listener.py | 18 ++++++++++++++++-- inventory-backend/app/utils/decorators.py | 5 +++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/inventory-backend/app/core/audit_listener.py b/inventory-backend/app/core/audit_listener.py index 8673f20..b718b34 100644 --- a/inventory-backend/app/core/audit_listener.py +++ b/inventory-backend/app/core/audit_listener.py @@ -98,6 +98,7 @@ def _store_audit_details(module, target_id, action, details): 'action': action, 'details': details } + print(f"💾 [X光-存储] 已存入 g.audit_details, key: {key}, details: {details}") # ============================================================ @@ -106,7 +107,10 @@ def _store_audit_details(module, target_id, action, details): def before_update_listener(mapper, connection, target): """SQLAlchemy before_update 监听器""" + print(f"🔔 [X光-监听器] before_update 被调用, target: {target.__class__.__name__}") + if not _is_audit_model(mapper): + print(f"⏭️ [X光-监听器] 跳过非审计模型: {mapper.class_.__name__}") return # ★ 使用 inspect(target) 而非 inspector._instance_state(target) @@ -125,13 +129,21 @@ def before_update_listener(mapper, connection, target): 'new': _serialize_value(new_val) } + print(f"📊 [X光-监听器] 计算完成, changes: {changes}") + if changes: module = _get_module_name(mapper) target_id, target_name = _extract_unique_key(target) - + # ★ 将变更存入 g details = {'changes': changes} + + # ★ X光调试:确认监听器是否成功算出 changes + print(f"🚀 [X光-监听器] 成功触发! target: {target}, changes: {changes}") + _store_audit_details(module, target_id, 'update', details) + else: + print(f"⚠️ [X光-监听器] 无变更,跳过") def before_delete_listener(mapper, connection, target): @@ -155,6 +167,7 @@ def before_delete_listener(mapper, connection, target): # ★ 将删除快照存入 g details = {'deleted_snapshot': deleted_snapshot} + print(f"🗑️ [X光-监听器] delete 触发, target_id: {target_id}") _store_audit_details(module, target_id, 'delete', details) @@ -178,6 +191,7 @@ def after_insert_listener(mapper, connection, target): # ★ 将新增数据存入 g details = {'created': new_snapshot} + print(f"➕ [X光-监听器] insert 触发, target_id: {target_id}") _store_audit_details(module, target_id, 'create', details) @@ -214,4 +228,4 @@ def register_audit_listeners(db): except Exception as e: current_app.logger.warning(f'[审计] 绑定模型 {model.__name__} 失败: {e}') - return len(audit_models) + return len(audit_models) \ No newline at end of file diff --git a/inventory-backend/app/utils/decorators.py b/inventory-backend/app/utils/decorators.py index fade754..ba4c683 100644 --- a/inventory-backend/app/utils/decorators.py +++ b/inventory-backend/app/utils/decorators.py @@ -319,6 +319,8 @@ def audit_log(module: str, action: str = None, get_target_id_fn=None, get_target break # 保存日志(统一入库) + print(f"📥 [X光-装饰器] 准备入库! details: {details}, g.audit_details: {getattr(g, 'audit_details', 'NOT_FOUND')}") + log_entry = AuditLog( user_id=user_id, username=username, @@ -338,6 +340,9 @@ def audit_log(module: str, action: str = None, get_target_id_fn=None, get_target db.session.commit() except Exception as e: + import traceback + traceback.print_exc() + print(f"💥 [X光-崩溃] 审计入库失败原因: {str(e)}") current_app.logger.error(f"审计日志记录失败: {str(e)}") db.session.rollback()