日志操作
概述
在实际开发中,对于某些关键业务,我们通常需要记录该操作的内容,一个操作调一次记录方法,每次需收集参数等等,会造成大量代码重复。
我们希望代码中只有业务相关的操作,在项目中使用注解来完成此项功能。
快速上手
1、在业务模块的pom
文件中添加依赖
html
<!--pangea公共工具包 -->
<dependency>
<groupId>com.hisense.pangea</groupId>
<artifactId>pangea-common-log</artifactId>
<version>${pangea.version}</version>
</dependency>
2、在需要被记录日志的controller方法上添加@Log注解,使用方法如下:
java
@PostMapping("save")
@Log(title = "规则组", businessType = BusinessType.INSERT, LogCustomerArrayAnno = {
@LogCustomer(customColumn = "param1",customColumnType = CustomColumnType.HEADER,headKey = "#systemname"),
@LogCustomer(customColumn = "param2",customColumnType = CustomColumnType.METHODPARAM,methodKey = "#ruleGroup.getPackageName")})
public int addSave(@RequestBody RuleGroup ruleGroup) {
return ruleGroupService.insertRuleGroup(ruleGroup);
}
支持参数如下:
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
title | String | 空 | 操作模块 |
businessType | BusinessType | OTHER | 操作功能(OTHER其他 INSERT新增 UPDATE修改 DELETE删除 GRANT授权 EXPORT导出 IMPORT导入 FORCE强退 GENCODE生成代码 CLEAN清空数据) |
operatorType | OperatorType | MANAGE | 操作人类别(OTHER其他 MANAGE后台用户 MOBILE手机端用户) |
isSaveRequestData | boolean | true | 是否保存请求的参数 |
LogCustomerArrayAnno | LogCustomer[] | {} | 自定义日志注解类@LogCustomer 数据库字段名customColumn(param1)存值类型customColumnType(HEADER请求头 METHODPARAM方法入参)方法入参表达式methodKey(#userDTO.getName)请求头属性表达式headerKey(#systemname) |
逻辑实现代码com.hisense.pangea.log.aspect.LogAspect
3、本地存储日志
可通过在yml配置文件中配置
pangea:
log:
local_storage: true
local_storage 该项如不配置或者配置为false,则日志存储到盘古数据库;配置为true,并且实现log组件中的方法则存储到本地数据库。实现类demo参考如下:
@Component(value = "demoLogServiceImpl")
@Primary
public class DemoLogServiceImpl implements AsyncLogService {
@Autowired
SysOperLogMapper operLogMapper;
@Override
@ConditionalOnMissingBean(DemoLogServiceImpl.class)
public void saveSysLog(OperationLog operationLog) {
HttpServletRequest request = ServletUtils.getRequest();
String systemName = request.getHeader(Constants.CURRENT_SYSTEMNAME);
operationLog.setOperTime(DateUtils.getNowDate());
SysOperLog sysOperLog = new SysOperLog();
BeanUtils.copyProperties(operationLog, sysOperLog);
sysOperLog.setSystemName(systemName);
operLogMapper.insertOperlog(sysOperLog);
}
}
如没有SysOperLog类,需创建
@Data
@EqualsAndHashCode(callSuper = false)
public class SysOperLog extends BaseEntity {
private static final long serialVersionUID = -5556121284445360558L;
/**
* 日志主键
*/
private Long operId;
/**
* 操作模块
*/
private String title;
/**
* 业务类型(0其它 1新增 2修改 3删除)
*/
private Integer businessType;
/**
* 请求方法
*/
private String method;
/**
* 请求方式
*/
private String requestMethod;
/**
* 操作类别(0其它 1后台用户 2手机端用户)
*/
private Integer operatorType;
/**
* 操作人员
*/
private String operName;
/**
* 部门名称
*/
private String deptName;
/**
* 请求url
*/
private String operUrl;
/**
* 操作地址
*/
private String operIp;
/**
* 操作地点
*/
private String operLocation;
/**
* 请求参数
*/
private String operParam;
/**
* 操作状态(0正常 1异常)
*/
private Integer status;
/**
* 错误消息
*/
private String errorMsg;
/**
* 操作时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date operTime;
/**
* 业务类型数组
*/
@TableField(exist = false)
private Integer[] businessTypes;
/**
* 返回参数
*/
private String jsonResult;
/**
* apm跟踪ID
*/
@TableField(exist = false)
private String traceId;
/**
* 系统名称
*/
private String systemName;
/**
* 环境编码
*/
private String envCode;
/**
* 平台编码
*/
private String platformCode;
/**
* 自定义字段1
*/
@TableField("PARAM_1")
private String param1;
/**
* 自定义字段2
*/
@TableField("PARAM_2")
private String param2;
/**
* 自定义字段3
*/
@TableField("PARAM_3")
private String param3;
/**
* 自定义字段4
*/
@TableField("PARAM_4")
private String param4;
/**
* 自定义字段5
*/
@TableField("PARAM_5")
private String param5;
}
同时需要确认是否有SYS_OPER_LOG该表,没有则需创建,建表语句如下:
CREATE TABLE
SYS_OPER_LOG
(
OPER_ID NUMBER(11),
TITLE VARCHAR2(50),
BUSINESS_TYPE NUMBER(2),
METHOD VARCHAR2(100),
REQUEST_METHOD VARCHAR2(10),
OPERATOR_TYPE NUMBER(1),
OPER_NAME VARCHAR2(50),
DEPT_NAME VARCHAR2(50),
OPER_URL VARCHAR2(255),
OPER_IP VARCHAR2(255),
OPER_LOCATION VARCHAR2(255),
OPER_PARAM VARCHAR2(4000),
STATUS NUMBER(1),
ERROR_MSG VARCHAR2(4000),
OPER_TIME TIMESTAMP(6),
JSON_RESULT VARCHAR2(2000),
SYSTEM_NAME VARCHAR2(255),
CREATED_BY VARCHAR2(255),
CREATED_DATE TIMESTAMP(6),
MODIFIED_BY VARCHAR2(255),
MODIFIED_DATE TIMESTAMP(6),
REMARK VARCHAR2(255),
PLATFORM_CODE VARCHAR2(256),
ENV_CODE VARCHAR2(256),
PARAM_1 VARCHAR2(2000),
PARAM_2 VARCHAR2(2000),
PARAM_3 VARCHAR2(2000),
PARAM_4 VARCHAR2(2000),
PARAM_5 VARCHAR2(2000),
);
operLogMapper中需要自己写一个插入方法
自定义操作功能(businessType)
在
BusinessType
中新增业务操作类型如:java/** * 测试 */ TEST,
在
sys_dict_data
字典数据表中初始化操作业务类型javainsert into sys_dict_data values(25, 10, '测试', '10', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '测试操作');
在
controller
中使用注解java@Log(title = "测试标题", businessType = BusinessType.TEST)
扩展自定义日志存储(LogCustomerArrayAnno)
在
CustomColumnType
中增加自定义日志类型如:java/** * 请求体 */ BODY,
在
LogCustomer
中增加表达式属性:java/** * 请求体表达式 */ String bodyKey() default "";
在
SYS_OPER_LOG
日志数据表中增加新的字段如:javaALTER TABLE SYS_OPER_LOG ADD (PARAM_6 VARCHAR(2000));
在
OperationLog
和SysOperLog
中增加新的字段如:java/** * 自定义字段6 */ @TableField("PARAM_6") private String param6;,
在
SysOperLogMapper.xml
中修改insertOperLog方法的SQL增加如:java<if test="param6 != null">param_6,</if> <if test="param6 != null">#{param6},</if>
在
controller
中使用注解java@PostMapping("save") @Log(title = "测试", businessType = BusinessType.INSERT, LogCustomerArrayAnno = { @LogCustomer(customColumn = "param6",customColumnType = CustomColumnType.BODY,bodyKey = "#ruleGroup.getPackageName")}) public int addSave(@RequestBody RuleGroup ruleGroup) { return ruleGroupService.insertRuleGroup(ruleGroup); }
使用效果
操作日志
操作日志用于记录系统访问用户的操作记录, 可记录系统模块、操作类型、操作人员、主机、状态、操作时间和该操作具体详情等相关信息。
注意
点击清空按钮会将数据库中的数据记录删除掉,点击导出按钮,可以将操作日志全部导出。
可点击数据行操作列的详细按钮查看该操作记录的操作模块、操作方法,操作方法对应的请求地址、请求方式及参数等信息。
请求地址
(对应后端接口路径)参数
(对应后端接口的传参)状态
(表示该接口的执行状态)
登录日志
登录日志用于记录用户登录系统的历史记录,可记录登录账号、登录ip地址、登录地点、访问浏览器、操作系统、状态、操作信息和操作时间等信息。
注意
点击清空按钮会将数据库中的数据记录删除掉
在线用户管理
在线用户管理用于查询当前登录用户的基本信息,包括登录账号、部门名称、主机、登录地点、浏览器、操作系统以及操作时间这些信息。 点击退出登录,当前用户将被强制退出。
定时任务管理
定时任务管理可以新增、编辑、删除任务,还可以进行导出和日志操作。