sdk调用日志

目标:

将sdk的调用(请求参数+返回结果记录+调用方法标识+调用时间+耗时等)记录下来,以单条数据的呈现状态记录;

1.引入common包依赖(一般项目都会有依赖,一般不需要自己引,除非新项目)

<dependency>
<groupId>com.newyetai</groupId>
<artifactId>framework-common</artifactId>
<scope>provided</scope>
</dependency>

2.定义调用记录对象

  • 继承com.newyetai.sdk.common.dto.AbstractSdkInvokeLogDTO(如demo)
  • 直接使用com.newyetai.sdk.common.dto.DefaultSdkInvokeLogDTO

demo:

@Data
public class WechatInvokeLog extends AbstractSdkInvokeLogDTO {
/** **/
private static final long serialVersionUID = -5884860778744552814L;
@Builder
public WechatInvokeLog(Object requestData, Object responseData, Date requestDate,
String requestId) {
super(requestData, responseData, requestDate, requestId);
}
}

3.使用LogUtils.log(调用记录对象);

demo:

public static <S extends ISdkRequest, T extends BaseWeChatDTO, C extends Converter<S, RequestEntity<?>>> AlitaResult<T> execute(
C converter, S dto, Class<T> clazz) {
// 日志记录调用结果
Serializable responseData = null;
String requestId = RandomUtils.generateUUID();
try {
// 获得request
RequestEntity<?> request = converter
.convert(dto);
ResponseEntity<T> response;
// 执行
try {
response = restOperations.exchange(request, clazz);
} catch (Exception e) {
responseData = ExceptionUtils.getStackTrace(e);
return AlitaResult.error(SdkConstants.SDK_HTTP_INVOKE_ERROR_CODE, e.getMessage());
}
T result = response.getBody();
responseData = result;
String errCode = result.getErrcode();
// 成功
if (StringUtils.isBlank(errCode)
|| WechatConstants.REQUEST_OK_CODE.equals(errCode)) {
return AlitaResult.success(result).setRequestId(requestId);
}
return AlitaResult.error(SdkConstants.SDK_HTTP_INVOKE_RESPONSE_FAIL_CODE,
String.join(CommonConstants.COLON, errCode, result.getErrmsg()))
.setRequestId(requestId);
} finally {
/** 日志记录:方式1-自定义日志对象;会自动根据类名生成collectionName(注意事项里第二点)**/
LogUtils.log(WechatInvokeLog.builder().requestData(dto).responseData(responseData)
.requestId(requestId).methodType(dto.getMethodName()).build());
/** 日志记录:方式2-默认日志对象;需提供collectionName**/
LogUtils.log(DefaultSdkInvokeLogDTO.builder().requestData(dto)
.responseData(responseData).requestId(requestId).collectionName("wechat_invoke_log")
.methodType(dto.getMethodName()).build());
}
}

4.注意事项:

  • 如果某个敏感字段不想被记录到日志,请用注解@Transient(不记录到mongo)和@JsonIgnore(不记录在控制台)标注该字段;
  • mongo里collection名称默认规则:调用记录对象dto的类型的小写snake(例:demo对应的collection为wechat_invoke_log);
  • responseData可以是调用结果,也可以是调用发生的异常栈信息;
  • 源码LogUtils.log中的provider,默认提供者是Slf4jLogProvider,但如果引入framework-mongodb依赖,默认提供者会替换成MongoLogProvider,就会使用mongo记录日志;