文章目录
java
@UtilityClass
@Slf4j
public class GsonUtils {
private static final Gson GSON = new Gson();
public static String toJsonStr(Object object) {
return GSON.toJson(object);
}
public static String toJsonStr(Object obj, Type type) {
return GSON.toJson(obj, type);
}
public static <T> T fromJson(String json, Class<T> classOfT) {
return GSON.fromJson(json, classOfT);
}
public static <T> T fromJson(String json, Type typeOfT) {
return GSON.fromJson(json, typeOfT);
}
public static String toJson(Object object) {
try {
return GSON.toJson(object);
} catch (Exception e) {
log.error("序列化失败", e);
}
return StringUtils.EMPTY;
}
}
一、打日志方式
java
log.warn("XxxTService.queryXxx...参数错误 param: {}", GsonUtils.toJsonStr(request), e);
二、throw
java
throw new GatewayException(2000, String.format("xxx异常,req:[%s]", GsonUtils.toJsonStr(req)), e);
三、打印日志处
-
**请求入出口:**在函数或对外接口处打印日志,方便进行日志统计,同时也方便系统运行状态监控。
-
**接口调用 :**需打印接口调用参数和调用结果。
-
**程序异常:**异常时要么抛出异常,要么在catch块中打印异常堆栈信息,但不要重复打印,如又在catch中抛异常又打印错误日志。
-
**特殊条件分支:**对于一些不合理的非预期情况,可以打印日志,也可以抛异常。
-
**关键路径:**可以理解为是系统的核心的逻辑操作,如单据状态流转操作,库存操作等,主要由业务系统自行判断,对业务操作的结果成功与否起到决定性作用,这部分记录的日志对于后期排查业务主流程问题能提供关键决策信息。
-
数据的导入导出: 涉及接收外部导入数据或者导出数据,记录操作者,以及操作输入相关的查询条件,不要求一定记录具体查询到的数据内容(数据量过大则不应该记录)。
四、实践
等级 | 内容 | 备注 | |
---|---|---|---|
*强制* | 正确的记录异常堆栈信息 | try { Integer x = null; ++x; } catch (Exception e) { log.error("Error reading configuration file", e); } |
|
*强制* | log本身不要引入异常,注意防止NPE | //request为null,则该打印日志语句将抛出异常。 logger.debug("Processing request with id: {}", request.getId()); |
|
*强制* | 严禁打印info日志无脑的记录方法的出入参,尤其是当请求入参和返回结果对象很大的时候,非常影响接口的性能。应该只记录出入参的核心信息。 | ||
*强制* | 避免打印敏感信息明文,如身份证号、银行卡号等,防止日志文件外泄导致用户敏感信息泄露,可以打token。 | ||
*推荐* | 循环中尽量不打印日志,一定要打印,可以加上条件判断,记录关键节点信息 | ||
*推荐* | [ ] 进行参数隔离,可读性好 | logger.info("Save order with order no:[{}], and order amount:[{}]", orderNo, orderAmount); |
|
*建议* | 使用warn日志级别来记录用户输入参数错误的情况,如非必要,请不要在此场景打出 error 级别,避免频繁报警。 | ||
*建议* | 不要输出太多日志信息,避免拖慢应用系统:通常每小时输出到disk的数据量达到上百MiB就已经是上限了。 | 1、并发查询的时,需要将req和resp一起打印,方便一一对应 |
五、实操:
5.1 最佳实践
java
Response response = null;
try {
response = commonTaskTService.closeTask(req);
log.info("close Task ,req:[{}],response: [{}]", GsonUtils.toJsonStr(req), GsonUtils.toJsonStr(response));
if (response == null || response.getCode() != 0) {
throw new BusinessException(2000, "关闭任务失败~ response: " + GsonUtils.toJsonStr(response));
}
5.2 方法出错的时候加入error日志
java
log.error("xxx 内部异常,req:[{}]", GsonUtils.toJsonStr(request), e);