# appLog应用审计日志组件
# 背景
标准产品后台管理员提供了“应用日志”模块,该模块记录了各应用的关键行为记录,可作为审计、防抵赖。
开发人员可参考本组件文档对应用日志进行新增、修改。
# 接口说明
接口路径: \ctp-core\src\main\java\com\seeyon\ctp\common\appLog\manager\AppLogManager.java
接口核心方法:
public interface AppLogManager{
/**
* 插入操作日志<br>
* AppLogAction的枚举值对应一条国际化key,前缀统一采用"appLog.action."<br>
* 如枚举Coll_New(101),对应Key: "appLog.action.101" <br>
* 同时增加操作类型简称,appLog.actionType.101 = 新建协同
* 新增加枚举时需要增加对应的key,变参目由你的国际化key决定.
* @param user 登录用户
* @param action 操作类型枚举
* @param params 操作描述国际化key对应的参数
*/
@Deprecated
public void insertLog(User user, AppLogAction appLogAction, String... params);
/**
* 传参参考insertLog(User user, AppLogAction appLogAction, String... params)
* 唯一区别actionId对应AppLogAction.getKey(),适用于客开不侵入AppLogAction源码场景
**/
public void insertLog(User user, Integer actionId, String... params);
/**
* 批量插入操作日志<br>
* AppLogAction的枚举值对应一条国际化key,前缀统一采用"appLog.action."<br>
* 如枚举Coll_New(101),对应Key: "appLog.action.101" <br>
* 新增加枚举时需要增加对应的key,变参目由你的国际化key决定.
* @param user 登录用户
* @param action 操作类型枚举
* @param labelsList 操作描述国际化key对应的参数list, List<String[]>根据自己情况构造
*/
@Deprecated
public void insertLogs(User user, AppLogAction appLogAction, List<String[]> labelsList);
/**
* 传参参考insertLogs(User user, AppLogAction appLogAction, List<String[]> labelsList)
* 唯一区别actionId对应AppLogAction.getKey(),适用于客开不侵入AppLogAction源码场景
**/
public void insertLogs(User user, Integer actionId, List<String[]> labelsList);
// ---------------- 忽略若干其它方法
}
# 组件接入方法
# AppLogAction注册枚举
AppLogAction并不是开发必须接入的元素,只是让大家理解应用日志的对应关系。
ctp-core\src\main\java\com\seeyon\ctp\common\appLog\AppLogAction.java
枚举类管理了所有审计日志动作,每个模块每个操作类型可在此注册。新版本被 apps-common\src\main\webapp\WEB-INF\cfgHome\i18n\applog\AppLogActions.txt
文件取代。
AppLogAction中的数字编号key是核心,新的开发场景可以不用在此枚举类注册,只需要遵守数字编号key唯一,在后续步骤做好注册即可。
数字编号key规范:
- 每一个模块占用100个编号,比如协同100~199;公告500~599;组织机构800~899
- 模块下的每个类型占用一个唯一编号,比如新建协同101,删除协同105
/**
* 应用日志操作类型枚举
*/
@Deprecated
public enum AppLogAction {
/**协同_新建协同*/
Coll_New(101),
/**协同_转发协同*/
Coll_Transmit(102),
/**协同_删除*/
Coll_Delete(105),
忽略若干代码......
/**公告_新建公告 */
Bulletin_New(501),
/**公告_修改公告 */
Bulletin_Modify(502),
忽略若干代码......
private int key;
AppLogAction(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
# 维护applog-xxx.properties国际化文件
应用审计日志国际化文件存放于 \apps-common\src\main\webapp\WEB-INF\cfgHome\i18n\applog
目录下。 国际化文件正常会有:中文、繁体、英文一式三份,命名格式为applog-模块编号_多语言名称.properties
。
以协同模块(占用100~199)为例,英文就是applog-100_en.properties,中文就是applog-100_zh_CN.properties,显示效果如下图:
同理,公告则存放于applog-500_xxx.properties文件中:
开发实际新增、修改维护应用日志就是这些文件,以下是applog-500_zh_CN.properties文件的示例代码:
appLog.action.501 = {0}新建了公告:《{1}》
appLog.action.502 = {0}修改了公告:《{1}》
appLog.action.503 = {0}发布了公告:《{1}》
appLog.actionType.501 = 新建公告
appLog.actionType.502 = 修改公告
appLog.actionType.503 = 发布公告
appLog.action.类型编号与appLog.actionType.类型编号是成对出现。
假如我们需要在公告模块新增一个应用审计类型叫“公告转发”,则需要搜索applog-500_zh_CN.properties文件中的所有数字编号,找一个不存在的编号将其定义成“公告转发”。比如公告501~550、560~599都被使用了,那么我们可以取551~559的其中一个数字做编号,比如数字552:
appLog.action.501 = {0}新建了公告:《{1}》
appLog.action.502 = {0}修改了公告:《{1}》
appLog.action.503 = {0}发布了公告:《{1}》
appLog.action.552 = {0}转发了公告:《{1}》
appLog.actionType.501 = 新建公告
appLog.actionType.502 = 修改公告
appLog.actionType.503 = 发布公告
appLog.actionType.552 = 转发公告
# 业务点调用接口写入日志
新的应用日志编号及日志国际化内容定义好之后,业务侧则调用接口执行日志写入即可:
public class BulDataManagerImpl implements BulDataManager {
// 注入appLogManager接口
private AppLogManager appLogManager;
public void setAppLogManager(AppLogManager appLogManager) {
this.appLogManager = appLogManager;
}
public Result shareBul(Map<String, Object> param) throws BusinessException {
....
// 转发后调用写入应用日志的接口
appLogManager.insertLog(user, 552, userName, bulData.getTitle());
....
}
}
# 结果检查
以上完成后,可以通过页面测试代码是否生效。也可以通过数据库查询ctp_app_log表检查应用日志是否生效。
