package com.dsh.other.audit; import com.dsh.other.entity.SysAccountAuditLog; import com.dsh.other.service.SysAccountAuditLogService; import feign.Logger; import feign.Request; import org.slf4j.LoggerFactory; import java.util.UUID; /** 将本服务发起的 Feign 调用同步写入统一审计表,不记录请求正文。 */ public class FeignAuditLogger extends Logger { private final org.slf4j.Logger logger = LoggerFactory.getLogger(FeignAuditLogger.class); private final SysAccountAuditLogService auditLogService; /** * 构造 Feign 审计日志器。 * * @param auditLogService 审计日志服务 */ public FeignAuditLogger(SysAccountAuditLogService auditLogService) { this.auditLogService = auditLogService; } @Override protected void log(String configKey, String format, Object... args) { logger.debug(methodTag(configKey) + format, args); } @Override protected void logRequest(String configKey, Level logLevel, Request request) { try { SysAccountAuditLog auditLog = new SysAccountAuditLog(); auditLog.setTraceId(UUID.randomUUID().toString().replace("-", "")); auditLog.setSourceService("mb-cloud-other"); auditLog.setSourceType("FEIGN"); auditLog.setOperationType("FEIGN_CALL"); auditLog.setRiskLevel(AuditLogSupport.riskLevel(request.url(), "FEIGN_CALL")); auditLog.setOperationName(configKey); auditLog.setRequestMethod(request.httpMethod().name()); auditLog.setRequestUri(request.url()); auditLog.setRequestParams(request.body() == null ? null : "bodyBytes=" + request.body().length + ", contentType=" + request.headers().get("Content-Type")); auditLogService.append(auditLog); } catch (Exception e) { logger.error("Feign审计日志写入失败, configKey={}", configKey, e); } super.logRequest(configKey, logLevel, request); } }