micssoftmsfactory/AutologInsert

GitHub: micssoftmsfactory/AutologInsert

基于 AST 的命令行源代码插桩工具,自动在多语言函数和控制流中插入带元数据的日志标记,并可转换为兼容 mklog2seq 的日志输出语句。

Stars: 0 | Forks: 0

## 相关项目 使用 mklog2seq 可视化生成的日志: https://github.com/micssoftmsfactory/mklog2seq # AutologInsert Node 这是一个基于 AST 的 Node.js CLI,用于在源代码中插入 Autolog 标记。 该工具会读取源代码,检测函数和控制流块,并插入诸如 `//$$START_FUNC$$`、`//$$END_IF$$`、`//$$RETURN_FUNC$$` 的标记。 每个标记都会自动嵌入原始源的文件名、行号和函数名。如果无法获取函数名,则使用 ``;函数外部使用 ``;标准输入使用 ``。标记行始终从行首插入,不添加缩进。 除了在输入源代码中插入标记外,还提供了一种模式,可以将结果转换为适用于 `mklog2seq` 的 `start` / `return` / `end` 格式的日志输出语句。转换后的日志语句也会从行首输出。 在 `START_FUNC` 的日志中,会输出运行时的参数值,而不是参数名的字符串。`RETURN_FUNC` 会输出返回值的表达式。除 `START_FUNC` / `RETURN_FUNC` / `END_FUNC` 之外的标记,目前作为未来计划的支持,在 `-logs` 转换期间会被丢弃。对于 C 语言,由于难以安全地将动态类型转换为字符串,目前仍保持为静态消息。 ## 支持的语言 - C - C++ - C# - Java - JavaScript - PHP ## 运行环境要求 - Node.js `>= 24` ## 安装 ``` npm install ``` ## 使用方法 ``` node ./src/cli.js [options] [source-file] ``` 选项: - `-i `: 指定输入文件。如省略,则从标准输入读取。 - `-o `: 指定输出文件。如省略,则输出到标准输出。 - `-markers-to-logs`, `-logs`: 在输入源中插入 `//$$...$$` 标记,并将其结果转换为兼容 `mklog2seq` 的日志输出语句。 - `-c`: 将输入视为 C 语言。 - `-cpp`: 将输入视为 C++ 语言。 - `-csharp` 或 `-cs`: 将输入视为 C# 语言。 - `-java`: 将输入视为 Java 语言。 - `-javascript` 或 `-js`: 将输入视为 JavaScript 语言。 - `-php`: 将输入视为 PHP 语言。 - `-VC`: `-c` 的别名。 - `-h`, `-help`, `--help`: 显示帮助信息。 如果省略指定语言的标志,CLI 将根据文件扩展名自动判断语言。 ## 使用示例 转换 JavaScript 文件并输出到标准输出的示例: ``` node ./src/cli.js -javascript ./example.js ``` 转换 PHP 文件并保存的示例: ``` node ./src/cli.js -php -i ./input.php -o ./output.php ``` 将 JavaScript 文件转换为基于 `console.log(...)` 日志输出代码的示例: ``` node ./src/cli.js -javascript -logs -i ./input.js -o ./logged.js ``` 生成的标示例: ``` function example(value) { //$$START_FUNC|file=input.js|line=1|func=example|args=value$$ //$$RETURN_FUNC|file=input.js|line=3|func=example|expr=value$$ //$$END_FUNC|file=input.js|line=1|func=example|args=value$$ } ``` 实际的标记值会进行 URL 编码,以确保分隔符得到安全处理。 `-logs` 的 JavaScript 输出示例: ``` function example(value) { console.log("input.js:1:example(" + [value].join(", ") + ") start"); console.log("input.js:3:example return(" + String(value) + ")"); console.log("input.js:1:example end"); } ``` 从标准输入接收数据的示例: ``` Get-Content .\input.java | node .\src\cli.js -java > output.java ``` ## 运行验证 可以在以下网站验证 Autolog 的运行情况。 - https://www.mics-soft.jp/autolog/ ## 注意事项 - 目前,C 语言的输入会作为回退方案,使用 C++ 的 tree-sitter grammar。 - 目前,C# 使用基于 token 的回退处理,而不是 tree-sitter。 - 对于超过此 Node.js runtime 中 tree-sitter 的 32,767 字符限制的 `javascript` 输入,会自动切换到基于 token 的回退处理。 - 对于超过此 Node.js runtime 中 tree-sitter 的 32,767 字符限制的 `c` / `cpp` 输入,会自动切换到基于 token 的回退处理。 - 在此 Node.js runtime 中,对于超过 32,767 字符的输入,`java` 的 tree-sitter 路径可能会失败。 - 如果使用了回退处理,警告将输出到标准错误输出。 - 由于 `package.json` 中设置了 `"private": true`,因此目前暂定仅通过 GitHub 发布,而不发布到 npm。 ## 仓库结构 - [src/cli.js](./src/cli.js): 命令行入口点 - [src/instrument.js](./src/instrument.js): 语言判断与标记插入的实现 - [src/markerToLog.js](./src/markerToLog.js): 标记替换模式的调度 - [src/marker-loggers/](./src/marker-loggers): 针对各语言转换为兼容 `mklog2seq` 日志的实现 ## 许可证 MIT 许可证。详情请参阅 [LICENSE](./LICENSE)。
标签:GNU通用公共许可证, MITM代理, Node.js, 云安全监控, 代码插桩, 文档结构分析, 日志追踪, 自定义脚本, 静态分析