package com.vincent.rsf.httpaudit.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.vincent.rsf.httpaudit.entity.HttpAuditLog; import com.vincent.rsf.httpaudit.mapper.HttpAuditLogMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.LinkedHashMap; import java.util.Map; /** * 异步落库;失败时打全量日志,不向业务抛错 */ @Slf4j @Service @RequiredArgsConstructor public class HttpAuditAsyncRecorder { private final HttpAuditLogMapper httpAuditLogMapper; private final ObjectMapper objectMapper = new ObjectMapper(); @Async("httpAuditExecutor") public void save(HttpAuditLog entity) { try { httpAuditLogMapper.insert(entity); } catch (Throwable t) { try { Map dump = new LinkedHashMap<>(); dump.put("serviceName", entity.getServiceName()); dump.put("scopeType", entity.getScopeType()); dump.put("uri", entity.getUri()); dump.put("method", entity.getMethod()); dump.put("functionDesc", entity.getFunctionDesc()); dump.put("queryString", entity.getQueryString()); dump.put("requestBody", entity.getRequestBody()); dump.put("responseBody", entity.getResponseBody()); dump.put("httpStatus", entity.getHttpStatus()); dump.put("okFlag", entity.getOkFlag()); dump.put("spendMs", entity.getSpendMs()); dump.put("clientIp", entity.getClientIp()); dump.put("errorMessage", entity.getErrorMessage()); String json = objectMapper.writeValueAsString(dump); log.error("http-audit 落库失败,全量JSON如下:{}", json, t); } catch (JsonProcessingException je) { log.error("http-audit 落库失败且序列化审计内容失败,requestBody.length={}, responseBody.length={}", entity.getRequestBody() == null ? -1 : entity.getRequestBody().length(), entity.getResponseBody() == null ? -1 : entity.getResponseBody().length(), t); log.error("序列化异常", je); } } } }