# appLog应用审计日志组件

# 背景

标准产品后台管理员提供了“应用日志”模块,该模块记录了各应用的关键行为记录,可作为审计、防抵赖。

开发人员可参考本组件文档对应用日志进行新增、修改。

1745742263750.png

# 接口说明

接口路径: \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,显示效果如下图:

1745747528400.png

同理,公告则存放于applog-500_xxx.properties文件中:

1745750797841.png

开发实际新增、修改维护应用日志就是这些文件,以下是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表检查应用日志是否生效。

编撰人:het