Skip to content

日志操作

概述

在实际开发中,对于某些关键业务,我们通常需要记录该操作的内容,一个操作调一次记录方法,每次需收集参数等等,会造成大量代码重复。
我们希望代码中只有业务相关的操作,在项目中使用注解来完成此项功能。

快速上手

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)
public int addSave(@RequestBody RuleGroup ruleGroup) {
	return ruleGroupService.insertRuleGroup(ruleGroup);
}

支持参数如下:

参数类型默认值描述
titleString操作模块
businessTypeBusinessTypeOTHER操作功能(OTHER其他 INSERT新增 UPDATE修改 DELETE删除 GRANT授权 EXPORT导出 IMPORT导入 FORCE强退 GENCODE生成代码 CLEAN清空数据)
operatorTypeOperatorTypeMANAGE操作人类别(OTHER其他 MANAGE后台用户 MOBILE手机端用户)
isSaveRequestDatabooleantrue是否保存请求的参数

逻辑实现代码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;
}

同时需要确认是否有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)
    );

operLogMapper中需要自己写一个插入方法

自定义操作功能(businessType)

  1. BusinessType中新增业务操作类型如:

    java
    /**
     * 测试
     */
    TEST,
  2. sys_dict_data字典数据表中初始化操作业务类型

    java
    insert 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', '测试操作');
  3. controller中使用注解

    java
    @Log(title = "测试标题", businessType = BusinessType.TEST)

使用效果

操作日志

操作日志用于记录系统访问用户的操作记录, 可记录系统模块、操作类型、操作人员、主机、状态、操作时间和该操作具体详情等相关信息。

页面设计器

注意

点击清空按钮会将数据库中的数据记录删除掉,点击导出按钮,可以将操作日志全部导出。

可点击数据行操作列的详细按钮查看该操作记录的操作模块、操作方法,操作方法对应的请求地址、请求方式及参数等信息。

页面设计器

  • 请求地址(对应后端接口路径)
  • 参数(对应后端接口的传参)
  • 状态(表示该接口的执行状态)

登录日志

登录日志用于记录用户登录系统的历史记录,可记录登录账号、登录ip地址、登录地点、访问浏览器、操作系统、状态、操作信息和操作时间等信息。

页面设计器

注意

点击清空按钮会将数据库中的数据记录删除掉

在线用户管理

在线用户管理用于查询当前登录用户的基本信息,包括登录账号、部门名称、主机、登录地点、浏览器、操作系统以及操作时间这些信息。 点击退出登录,当前用户将被强制退出。

页面设计器

定时任务管理

定时任务管理可以新增、编辑、删除任务,还可以进行导出和日志操作。