news 2026/9/10 21:30:16

ToolJet 审计日志(Audit Logs)完整指南:记录、筛选、脱敏与文件导出

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ToolJet 审计日志(Audit Logs)完整指南:记录、筛选、脱敏与文件导出

ToolJet 审计日志(Audit Logs)完整指南:记录、筛选、脱敏与文件导出

【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 🚀项目地址: https://gitcode.com/GitHub_Trending/to/ToolJet

本文围绕 ToolJet 的审计日志(Audit Logs)功能展开,系统讲解如何通过日期范围与多维度筛选检索账户内全部操作记录、如何解读每条日志的完整字段结构,以及如何通过环境变量配置日志文件的生成路径、每日轮转与敏感信息脱敏。读完本文,你将能够在自托管部署中开启审计日志文件输出,并结合 环境变量配置 与 syslog 集成方案 落地合规审计与安全追踪。

付费功能提示:Audit Logs 属于 ToolJet 的付费功能(Paid feature),需要对应的许可证支持。

什么是审计日志

审计日志是 ToolJet 账户内所有操作行为的自动记录报告。它自动捕获并展示事件,记录谁(who)何时(when)何地(where)执行了什么操作(what),同时附带 IP 地址等信息。简单来说,每一次登录、建应用、跑查询、改权限等动作,都会被记录成一条可检索、可追溯的事件。

在服务端,每条审计事件对应一张数据库表记录,其实体定义位于 server/src/entities/audit_log.entity.ts,对应数据库表audit_logs。核心字段包括:

  • id:UUID 主键,唯一事件 ID;
  • user_id/organization_id:执行者用户与所属组织;
  • resource_id/resource_name/resource_type:被操作资源的 ID、名称与类型(resource_type使用枚举,取值见 server/src/modules/app/constants/modules.ts,包含APPUSERDataQueriesGroupPermissions等);
  • action_type:动作类型(如APP_CREATEUSER_LOGIN);
  • ip_address:来源 IP;
  • metadata:JSON 结构,包含tooljet_versionuser_agent
  • created_at:事件产生时间。

日志写入侧还使用了 winston 自定义格式auditLog(见 server/src/modules/audit-logs/constants/index.ts),把审计数据注入auditLog字段并提取resourceType作为日志label,这解释了下方示例日志文件中的结构。

在界面中查看与检索日志

打开账户的 Audit Logs 页面即可看到日志列表视图,默认展示最近 24 小时的日志,并提供日期范围选择、筛选与分页能力。

日期范围(Date Range)

  • 使用范围选择器(range picker)检索指定日期与时间区间内发生的事件;
  • 默认加载最近 24 小时的日志作为初始视图;
  • "from" 与 "to" 之间可指定的最大跨度是 30 天,超出范围无法检索;
  • 页面底部提供分页导航,每页最多展示 7 条日志

30 天最大查询跨度由许可证条款控制。前端通过getMaxDurationForAuditLogs()请求/license/audit-logs/max-duration接口获取上限(见 frontend/src/_services/auditLogsService.js),服务端对应控制器定义在 server/src/modules/licensing/controllers/audit-logs.controller.ts,其能力受许可证字段MAX_DURATION_FOR_AUDIT_LOGSmaxDaysForAuditLogs)约束(见 server/src/modules/licensing/constants/index.ts)。

筛选审计日志

Audit Logs 页面提供四组筛选条件,可组合使用以快速定位目标事件。

按用户筛选(Select Users)

从下拉列表中选择特定用户,即可查看该用户的所有活动记录。

按应用筛选(Select Apps)

下拉列表会展示当前账户关联的全部应用。选择某个应用后,日志将只保留与该应用相关的记录。

按资源筛选(Select Resources)

资源(Resources)说明
User过滤全部用户类事件,如USER_LOGINUSER_SIGNUPUSER_INVITEUSER_INVITE_REDEEM
App过滤全部应用类事件,如APP_CREATEAPP_UPDATEAPP_VIEWAPP_DELETEAPP_IMPORTAPP_EXPORTAPP_CLONE
Data Query过滤与数据查询关联的事件,如DATA_QUERY_RUN
Group Permission过滤全部与用户组权限关联的事件,包括GROUP_CREATEGROUP_UPDATEGROUP_DELETE
App Group Permission每个用户组内可为应用设置只读或可编辑权限,这些变更会作为应用组权限事件被记录。

前端获取资源列表调用getResources()请求/audit-logs/resources接口(见 frontend/src/_services/auditLogsService.js)。需要说明的是,资源枚举在代码层面是可扩展的:除上表外,server/src/modules/app/constants/modules.ts 中还定义了WorkflowsAppGitAppHistoryDataQueryFolders等更多模块类型,界面中是否展示取决于当前版本与许可证能力。

按动作筛选(Select Actions)

动作(Actions)说明
USER_LOGIN每次用户登录时记录。
USER_SIGNUP每次新用户注册时记录。
USER_INVITEManage Users中邀请用户时,每次发送邀请都会记录一条事件。
USER_INVITE_REDEEM邀请被兑换(接受)时记录。
APP_CREATE用户创建新应用时记录。
APP_UPDATE对应用重命名、设为公开、编辑分享链接或部署应用等操作时记录。
APP_VIEW有人查看已发布应用时记录(公开应用不计入)。
APP_DELETE用户从仪表盘删除应用时记录。
APP_IMPORT用户导入应用时记录。
APP_EXPORT应用被导出时记录。
APP_CLONE复制现有应用生成克隆时记录。
DATA_QUERY_RUN添加数据源、创建查询,或从查询编辑器/已发布应用中运行查询时记录。
GROUP_PERMISSION_CREATE创建用户组时记录。
GROUP_PERMISSION_UPDATE向组中添加/移除应用或用户,或更新组权限时记录。
GROUP_PERMISSION_DELETE从账户中删除用户组时记录。
APP_GROUP_PERMISSION_UPDATE为用户组中的应用设置View(查看)或Edit(编辑)权限,且权限被更新时记录;默认情况下,应用对用户组的权限为View

理解日志信息

展开任一条日志,可以看到完整的结构化信息。下面对照 readinglogv2 截图 逐字段解读。

属性(Property)说明
action_type该事件记录的动作类型,具体取值见上文 按动作筛选 一节。
created_at事件被记录时的日期与时间。
id每条事件被分配的唯一事件 ID。
ip_address产生该事件来源的 IP 地址。
metadata包含两个子属性:tooljet_version(事件发生时 ToolJet 的版本)与user_agent(使用的设备与浏览器信息)。
organization_idToolJet 中每个组织都有唯一 ID,事件发生时会被一并记录。
resource_id不同 资源 在创建时被分配各自关联的 ID。
resource_name参与事件记录的 资源 名称,例如创建或删除应用时会显示该应用的名称。
resource_type指示参与事件的 资源 类型。
user_id每个用户账户在 ToolJet 中有唯一 ID,事件发生时一并记录。

这些字段与数据库实体一一对应(见 server/src/entities/audit_log.entity.ts),其中resource_type是枚举列,取值源自MODULES常量(server/src/modules/app/constants/modules.ts),metadata以 JSON 存储。

日志文件:导出、轮转、脱敏与路径

除界面内查看外,审计日志还可以输出为本地文件,便于归档、投递到 syslog 或第三方分析平台。

日志文件(Log File)

日志文件会包含审计日志的全部数据。只要在环境变量中指定了路径,系统就会在该路径下生成日志文件,并且每生成一条新审计日志,文件都会被动态更新

关于如何启用日志文件生成,可参考 syslog 集成指南:只需将环境变量LOG_FILE_PATH设为期望的路径(例如rsyslog)即可激活该功能。详细的启动与验证步骤(包括如何检查生成的目录结构)都在该文档中。

日志轮转(Log Rotation)

日志文件按每日轮转:每天都会创建一个新日志文件,从而高效地管理与组织审计数据。实现上,服务端基于winston-daily-rotate-fileDailyRotateFiletransport 完成轮转,目录名为{process_id}-%DATE%,文件名固定为audit.log,日期模式为YYYY-MM-DD;轮转时还会把旧文件的内容整理并写出为.json格式的归档文件,相关代码见 server/src/modules/log-to-file/constants/index.ts。

日志脱敏(Log Redaction)

ToolJet 实现了日志脱敏以保护敏感信息。默认情况下,以下请求/响应头在日志中被掩码:

  • authorization
  • cookie
  • set-cookie
  • x-api-key
  • proxy-authorization
  • www-authenticate
  • authentication-info
  • x-forwarded-for

在服务端,这些默认脱敏路径被硬编码在 pino logger 的redact.paths配置中,并统一使用[REDACTED]作为掩码内容;同时会把环境变量LOGGER_REDACT中的逗号分隔字段合并进脱敏路径列表(见 server/src/modules/app/loader.ts)。

此外,你还可以通过LOGGER_REDACT环境变量指定自定义脱敏字段

变量说明
LOGGER_REDACT需要被掩码的额外字段的逗号分隔列表(例如req.headers["x-session-id"],req.headers["x-device-fingerprint"]

例如:

LOGGER_REDACT=res.headers["x-rate-limit-remaining"],res.headers["x-request-id"]

注意:LOGGER_REDACT中的每个条目会被直接拼接到 pino 的redact.paths数组(server/src/modules/app/loader.ts),因此请使用与示例一致的 pino 路径语法(如req.headers["xxx"]res.headers["xxx"])。

日志文件路径(Log File Path)

日志文件的路径由环境变量LOG_FILE_PATH定义。该路径相对于机器的主目录(home directory)。例如,若LOG_FILE_PATH设为hsbc/dashboard/log,则最终生成的日志文件路径结构如下:

homepath/hsbc/dashboard/log/tooljet_log/{process_id}-{date}/audit.log

其中{process_id}是唯一进程标识符的占位符,{date}表示当前日期。这种结构化路径确保审计日志按进程与日期双重组织,便于追踪与分析。

变量说明
LOG_FILE_PATH日志文件将被创建的路径(例如tooljet/log/tooljet-audit.log

该行为与代码实现一致:服务端使用path.join(os.homedir(), filePath, 'tooljet_log')计算绝对目录,目录不存在时会自动递归创建,再以{processId}-%DATE%作为子目录写入audit.log(见 server/src/modules/log-to-file/constants/index.ts)。

示例日志文件数据

以下是一条APP_CREATE事件的真实日志结构(展开查看):

{ level: 'info', message: 'PERFORM APP_CREATE OF awdasdawdwd APP', timestamp: '2023-11-02 17:12:40', auditLog: { userId: '0ad48e21-e7a2-4597-9568-c4535aedf687', organizationId: 'cf8e132f-a68a-4c81-a0d4-3617b79e7b17', resourceId: 'eac02f79-b8e2-495a-bffe-82633416c829', resourceType: 'APP', actionType: 'APP_CREATE', resourceName: 'awdasdawdwd', ipAddress: '::1', metadata: { userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', tooljetVersion: '2.22.2-ee2.8.3' } }, label: 'APP' }

可以看到,auditLog内的字段与界面展示的日志属性一一对应,且与数据库实体字段保持一致;顶层timestamp使用YYYY-MM-DD HH:mm:ss格式,label取自resourceType,二者均由 winston 日志格式在写入时注入(见 server/src/modules/log-to-file/constants/index.ts 与 server/src/modules/audit-logs/constants/index.ts)。

数据保留策略

审计日志在数据库中会按保留期自动清理。服务端通过AuditLogsClearScheduler定时任务(server/src/modules/audit-logs/scheduler.ts)实现:

  • 任务每天凌晨 2:00(CronExpression.EVERY_DAY_AT_2AM)运行;
  • 删除早于保留期截止日期的日志,截止日期 = 当前日期 - 保留天数;
  • 保留天数由环境变量AUDIT_LOGS_RETENTION_PERIOD控制,默认 90 天
  • 将该变量设为0跳过清理,永久保留审计日志。
# 默认保留 90 天(不设置时) # 自定义保留天数,例如 30 天 AUDIT_LOGS_RETENTION_PERIOD=30 # 禁用自动清理,永久保留 AUDIT_LOGS_RETENTION_PERIOD=0

权限与可用性说明

审计日志受许可证(license)控制,属于付费能力:

  • 服务端通过FeatureAbilityGuard结合许可证字段LICENSE_FIELD.AUDIT_LOGSauditLogsEnabled)进行能力校验,前端在无权限时仅渲染空页面(见 frontend/src/modules/auditLogs/pages/AuditLogsPage/AuditLogsPage.jsx);
  • 后端提供/audit-logs/audit-logs/resources/license/audit-logs/license-terms/license/audit-logs/max-duration等接口(见 frontend/src/_services/auditLogsService.js 与 server/src/modules/licensing/controllers/audit-logs.controller.ts);
  • 在 server/src/modules/licensing/constants/index.ts 的计划定义中,Audit logs 属于 Team(business)及以上计划的功能。

最佳实践小结

  1. 按需设置保留期:默认 90 天的清理策略适合大多数场景;若有合规留存要求,可通过AUDIT_LOGS_RETENTION_PERIOD=0关闭清理,或设置更长天数。
  2. 开启日志文件输出:设置LOG_FILE_PATH(相对主目录)即可生成每日轮转的audit.log,轮转时自动产出 JSON 归档,方便投递 syslog 或导入分析平台。
  3. 主动脱敏敏感头:默认脱敏列表覆盖authorizationcookiex-api-key等常见敏感头;自定义头(如会话 ID、设备指纹)务必通过LOGGER_REDACT补充掩码,避免敏感信息进入日志。
  4. 善用筛选组合:结合「用户 + 应用 + 资源 + 动作」四维筛选与 30 天范围查询,可快速定位安全事件(如异常的USER_LOGIN、越权的APP_GROUP_PERMISSION_UPDATE)。
  5. 留意许可证边界:审计日志是付费功能,查询最大时间跨度也受许可证maxDaysForAuditLogs约束,自托管部署前请确认许可证与版本支持情况。

【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 🚀项目地址: https://gitcode.com/GitHub_Trending/to/ToolJet

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 21:24:12

Python游戏开发中的碰撞检测原理与优化实践

1. Python游戏开发中的碰撞检测核心原理 碰撞检测是游戏开发中最基础也最关键的物理交互系统。在Python游戏开发中,我们通常使用两种主流实现方式:基于矩形区域的边界检测和基于像素级的精确检测。 1.1 矩形碰撞检测(AABB算法) …

作者头像 李华
网站建设 2026/9/10 21:17:56

DEM分辨率与精度选择指南:从基础概念到工程实践

1. 数字高程模型基础概念解析 数字高程模型(Digital Elevation Model,简称DEM)是地理信息系统中最基础也是最重要的空间数据之一。简单来说,DEM就是用数字形式对地形表面进行建模表达的数据集。我第一次接触DEM是在2008年参与一个…

作者头像 李华
网站建设 2026/9/10 21:17:43

怀化小红书AI短视频:种草营销新玩法

来源:唐sirAI(www.tangsir.cc) | 电话:18874530691━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━随着AI技术的飞速发展,怀化小红书短视频已经成为怀化本地企业数字化营销的重要趋…

作者头像 李华