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, 云安全监控, 代码插桩, 文档结构分析, 日志追踪, 自定义脚本, 静态分析