64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
|
|
"""操作审计日志工具。异步写入,不阻塞主流程。"""
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import json
|
||
|
|
import threading
|
||
|
|
from datetime import datetime, timezone
|
||
|
|
from typing import Any
|
||
|
|
|
||
|
|
from as_platform.db.models import OperationLog
|
||
|
|
|
||
|
|
|
||
|
|
def log_op(
|
||
|
|
*,
|
||
|
|
user_id: int | None = None,
|
||
|
|
user_name: str | None = None,
|
||
|
|
category: str,
|
||
|
|
action: str,
|
||
|
|
target_type: str | None = None,
|
||
|
|
target_id: str | None = None,
|
||
|
|
summary: str = "",
|
||
|
|
detail: dict[str, Any] | None = None,
|
||
|
|
ip_address: str | None = None,
|
||
|
|
) -> None:
|
||
|
|
"""异步记录操作日志。"""
|
||
|
|
threading.Thread(
|
||
|
|
target=_write_log,
|
||
|
|
args=(user_id, user_name, category, action, target_type, target_id, summary, detail, ip_address),
|
||
|
|
daemon=True,
|
||
|
|
name=f"audit-log-{action}",
|
||
|
|
).start()
|
||
|
|
|
||
|
|
|
||
|
|
def _write_log(
|
||
|
|
user_id: int | None,
|
||
|
|
user_name: str | None,
|
||
|
|
category: str,
|
||
|
|
action: str,
|
||
|
|
target_type: str | None,
|
||
|
|
target_id: str | None,
|
||
|
|
summary: str,
|
||
|
|
detail: dict[str, Any] | None,
|
||
|
|
ip_address: str | None,
|
||
|
|
) -> None:
|
||
|
|
try:
|
||
|
|
from as_platform.db.engine import session_scope
|
||
|
|
|
||
|
|
with session_scope() as db:
|
||
|
|
log = OperationLog(
|
||
|
|
timestamp=datetime.now(timezone.utc),
|
||
|
|
user_id=user_id,
|
||
|
|
user_name=user_name,
|
||
|
|
category=category,
|
||
|
|
action=action,
|
||
|
|
target_type=target_type,
|
||
|
|
target_id=str(target_id)[:128] if target_id else None,
|
||
|
|
summary=summary[:512] if summary else None,
|
||
|
|
detail_json=json.dumps(detail, ensure_ascii=False) if detail else None,
|
||
|
|
ip_address=ip_address,
|
||
|
|
)
|
||
|
|
db.add(log)
|
||
|
|
db.commit()
|
||
|
|
except Exception:
|
||
|
|
pass # 日志写入失败不影响业务
|