{
"apiInfoDto": {
"instId": "每次请求唯一id,用于标识每次的请求",
"requestTime": "string",
"responseTime": "string",
"returnCode": 200,
"returnMsg": "success",
"returnStatus": "SUCCESS",
"page": 1,
"pageSize": 10,
"currentPageSize": 0
},
"respBody": {
}
}
注意:ResultBean是controller专用的,不允许传递到其它层,比如Service层;日志打印,不准自己打印方法入参,和返回结果,所有这类日志打印通过注解@Log进行日志打印,保证代码简洁,还有统一日志格式,也可防止漏打日志
1 . ** 不能太依赖debug,应该多依赖日志输出** 2 . 代码开发测试完成之后不要急着提交,先跑一遍看看日志是否看得懂 3 . 这些地方必须打印日志: – 分支语句的变量必须打印日志,重要参数必须打印(比如订单code等); – 修改(包括新增)操作必须打印日志(出问题,做到有证可查); – 数据量大的时候需要打印数据量,及耗时(用于分析性能。比如查询一个列表,要打印结果列表大小)
4 . 日志必须包含哪些信息: – 每次请求的唯一id(便于从海量的日志里区分某次请求); – 每次请求的用户信息(从海量日志里快速找到该用户做了什么);
以上列出了几条日志打印规则,其中加粗的地方,需要自己写代码的时候实现,其余的可通过注解@log配合日志框架sf4j实现,可参考以下几个常用场景的日志打印案例:
其中红色部分应该删除;打印日志效果如下:
其中红色框部分类容为该次请求的唯一id,绿色部分为该次请求的用户信息,紫色为请求入参和请求出参;
printInfoLog = true
参数即可,默认为false,不答应info日志:
效果如下:
这里打印出来的日志和debug级别日志相同,只是省去了修改日志级别的步骤,系统默认会打印info级别日志;
excludeInParam = {HmallApiInfoDto.class, BaseApiInfoDto.class}参数即可
param = {"departmentReqDto.apiInfoDto","departmentReqDto.companyId"}
效果如下:– 未指定参数效果如下(中间包含了很多你不想要打印的参数):
– 指定打印入参的apiInfoDto对象和DepartmentReqDto入参的code效果如下:
1. 重要参数,希望在一个方法的每个日志都出现
比如:更新科室时,科室的code,只需要添加参数:itemId = "departmentReqDto.code"
1. 根据日志知道是某个用户做了什么
比如在新增或者删除是,希望记录日志,以备出现问题时有证可查,只需要添加参数:itemType = "department", action = LogConst.Action.U
效果如下:
在controller上没有加itemType = "department", action = LogConst.Action.U
,所以通过日志信息,我们能理解到的是:
某次请求(id为:9481f40f-de4a-4aad-b52a-8e75879eaad1)的用户hmall_sa对表中的一条数据(code=D100038)进行了操作,具体是什么操作,新增、修改、查询还是删除通过这一条日志没法得知。
而通过Service打出的日志我们能知道:
某次请求,用户hmall_sa对表department中code=D100038的数据进行了更新操作,及更新的具体参数也能看见,这样一条日志就全部展示了这个用户什么时候做了什么操作。
1. 当一个方法返回结果是多个对象,有时候我们只想知道一共有多少个结果,所以此时全部打印出结果,难免有点浪费,可通过参数:printOutParamSize = true
来指定,只打印结果大小
org.springframework.beans.BeanUtils.copyProperties(source, dest)
和org.apache.commons.beanutils.BeanUtils.copyProperties(dest, source)
它们方法的参数顺序和之前工具类是相反的,改起来非常容易出错。如果突然有一天需要改成,复制参数的时候,有些特殊字段需要保留(如对象id)或者需要过滤掉(如密码)不复制,这时候改动的点也会涉及到比较多的地方。