ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ToolJet 审计日志落盘指南:基于 `LOG_FILE_PATH` 配置日志文件生成(Rsyslog)

2026/9/13 15:27:29 拓冰建站 浏览量
ToolJet 审计日志落盘指南:基于 `LOG_FILE_PATH` 配置日志文件生成(Rsyslog) ToolJet 审计日志落盘指南基于LOG_FILE_PATH配置日志文件生成Rsyslog【免费下载链接】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/ToolJetToolJet 的**日志文件log file**功能为审计日志提供了一份完整的落盘记录能够捕获平台内各类活动应用创建、删除、更新、查询执行等的关键信息。本文将以官方指南《Setup Log File Generation (Rsyslog)》为主线结合仓库源码讲解如何通过LOG_FILE_PATH环境变量激活该功能、日志文件如何按进程与日期组织、轮转规则是什么以及每条审计日志记录包含哪些字段。读完本文你将能够独立完成日志文件功能的启用、验证与运维排查。激活与配置Activation and Configuration环境变量设置日志文件功能默认处于关闭状态只有显式设置环境变量LOG_FILE_PATH才会被激活。该变量的值用于指定日志文件的存放路径例如LOG_FILE_PATHrsyslog在源码层面这一激活逻辑位于服务端模块加载器中。当检测到process.env.LOG_FILE_PATH存在时LogToFileModule才会被动态注册进 NestJS 应用见 server/src/modules/app/loader.tsif (process.env.LOG_FILE_PATH) { // Add log-to-file module if LOG_FILE_PATH is set const { LogToFileModule } await import(${await getImportPath(configs.IS_GET_CONTEXT)}/log-to-file/module); dynamicModules.push(await LogToFileModule.register(configs)); }因此不设置该变量就不会产生任何日志文件只有配置后服务端才会创建对应的日志目录与轮转 transport。路径相对家目录需要注意的是LOG_FILE_PATH指定的路径是相对于机器家目录home directory的相对路径而不是绝对路径。例如若服务器家目录为/home/tooljet则设置LOG_FILE_PATHrsyslog后日志的根目录将位于/home/tooljet/rsyslog。这一点在源码中有直接印证日志 transport 构造时会用os.homedir()拼接绝对路径见 server/src/modules/log-to-file/constants/index.tsconst absoluteLogDir path.join(os.homedir(), filePath, tooljet_log);也就是说实际路径的完整结构为家目录/{LOG_FILE_PATH}/tooljet_log。服务器重启配置完LOG_FILE_PATH环境变量后必须重启 ToolJet 服务端日志文件生成才会开始。这是因为模块加载器在应用启动阶段读取环境变量并决定是否注册LogToFileModule日志轮转 transportwinston-daily-rotate-file在服务启动时初始化并绑定到审计日志流上。重启后服务端才会识别新配置并开始记录审计日志。从源码结构看LogToFileModule通过 server/src/modules/log-to-file/module.ts 注册并使用createLogger(Log-to-file-transport)引导日志目录的创建过程。日志轮转与组织Log Rotation and Organization每日轮转日志文件采用**每日轮转daily rotation**机制即每天生成一个新的日志文件便于审计数据的高效管理与组织。这一行为由winston-daily-rotate-filetransport 实现关键配置如下见 server/src/modules/log-to-file/constants/index.tsconst transport new DailyRotateFile({ filename: audit.log, level: info, zippedArchive: false, dirname: ${absoluteLogDir}/${processId}-%DATE%, datePattern: YYYY-MM-DD, format: winston.format.combine(winston.format.prettyPrint()), json: true, });datePattern: YYYY-MM-DD控制按天轮转目录名中的%DATE%会被替换为当前日期filename: audit.log固定日志文件名level: info表示只记录 info 及以上级别的日志zippedArchive: false表示轮转出的旧日志不做压缩归档。每次轮转触发时transport 会打印换文件提示并将旧文件转换为 JSON 格式见 server/src/modules/log-to-file/constants/index.tstransport.on(rotate, function (oldFilename, newFilename) { console.log(Rotating old log file - ${oldFilename} and creating new log file ${newFilename}); readObjectFromLines(oldFilename); });日志文件路径结构日志文件的最终路径由LOG_FILE_PATH变量决定结合源码可推导出完整结构homepath/{LOG_FILE_PATH}/tooljet_log/{process_id}-{date}/audit.log其中homepath机器家目录如/home/tooljet{process_id}服务端进程的进程标识符源码中使用process.pid获取{date}当前日期格式为YYYY-MM-DD。在服务端优雅关闭OnApplicationShutdown时系统会按同样的结构定位并导出当日日志见 server/src/modules/app/schedulers/shut-down.hook.tsconst absoluteLogDir join(homedir(), envFilePath, tooljet_log); const currentDate new Date(); const formattedDate currentDate.toISOString().slice(0, 10); const filePath ${absoluteLogDir}/${process.pid}-${formattedDate}/audit.log; readObjectFromLines(filePath);这种进程 日期的目录结构使得同一进程当天的审计日志聚集在一个目录内跨天自动分目录便于追溯与分析。日志目录自动创建日志功能会在家目录下自动创建以LOG_FILE_PATH值命名的文件夹如rsyslog该文件夹作为审计日志存储的根目录。同时服务端启动时还会在内部再创建tooljet_log子目录若不存在源码通过fs.mkdirSync(absoluteLogDir, { recursive: true })实现递归创建见 server/src/modules/log-to-file/constants/index.ts因此无需手工预建任何目录。审计日志数据示例与字段说明日志记录捕获了审计事件的核心要素包括用户 ID、组织 ID、资源 ID、资源类型、操作类型、资源名称、IP 地址以及附加元数据。以下为官方文档给出的示例日志数据{ 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 }各字段含义如下字段说明level日志级别审计日志一般为infomessage人类可读的操作摘要如PERFORM APP_CREATE OF ... APPtimestamp事件发生时间格式YYYY-MM-DD HH:mm:ssauditLog.userId执行操作的用户 UUIDauditLog.organizationId用户所属组织工作区UUIDauditLog.resourceId被操作资源的 UUIDauditLog.resourceType资源类型如APP应用auditLog.actionType操作类型如APP_CREATE创建应用auditLog.resourceName资源名称auditLog.ipAddress发起请求的客户端 IPauditLog.metadata.userAgent客户端浏览器 User-AgentauditLog.metadata.tooljetVersion触发生成日志时的 ToolJet 版本号label资源标签如APP日志的时间戳格式由 winston 的format.timestamp({ format: YYYY-MM-DD HH:mm:ss })统一控制而auditLog字段由审计日志格式化函数注入见 server/src/modules/log-to-file/constants/index.tsexport const logFormat winston.format.combine( winston.format.timestamp({ format: YYYY-MM-DD HH:mm:ss }), auditLog(), logForm );其中logForm定义了timestamp level [label]: message的纯文本输出形态审计日志数据本身通过winston.format.prettyPrint()json: true以可读的 JSON 对象形式写入文件。日志的 JSON 化导出值得强调的是audit.log原始文件以 winston 的多行 pretty-print 格式写入每条记录为一个多行 JSON 对象。为了便于下游分析系统会在两个时机将当天的audit.log转换成标准 JSON 数组文件audit.log.json每日轮转时transport.on(rotate, ...)触发readObjectFromLines(oldFilename)服务端关闭时ShutdownHook.onApplicationShutdown对当天文件执行同样的转换见 server/src/modules/app/schedulers/shut-down.hook.ts。readObjectFromLines的核心逻辑是逐行读取原始文件按{边界切分多个多行对象拼接为[ {...}, {...} ]数组再以 2 空格缩进的标准 JSON 写入.json后缀文件见 server/src/modules/log-to-file/constants/index.ts。因此原始audit.log面向人读audit.log.json面向机器解析可直接被日志采集器或脚本消费。常见运维排查配置后没有日志产生确认LOG_FILE_PATH已正确写入服务端环境如.env文件见下方示意并重启服务端模块加载器仅在启动阶段读取该变量。日志目录出现在错误位置LOG_FILE_PATH是相对于家目录的路径请检查服务器家目录与预期是否一致完整目录为~/{LOG_FILE_PATH}/tooljet_log/{pid}-{date}/audit.log。轮转报错检查tooljet_log目录写权限transport 启动失败时会输出❌ Error while creating log file transport:错误信息轮转失败时控制台会打印Rotating old log file - ...与Log file generation error:日志。跨天找不到历史日志日志按{process_id}-{date}分目录查找历史记录时需带上对应的进程 ID 与日期。.env配置示意# 启用审计日志落盘路径相对家目录 LOG_FILE_PATHrsyslog小结ToolJet 的日志文件功能通过单一环境变量LOG_FILE_PATH即可激活为审计日志提供了进程 日期组织的每日轮转落盘机制。从 server/src/modules/app/loader.ts 的模块动态注册到 server/src/modules/log-to-file/constants/index.ts 中基于winston-daily-rotate-file的 transport 实现再到关闭时经ShutdownHook的 JSON 导出整条链路清晰且可独立运维。启用后审计日志即成为安全审计、行为追溯与合规分析的第一手数据源。【免费下载链接】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),仅供参考