日志与调试技巧
前言
大家好,我是鲫小鱼。是一名不写前端代码的前端工程师,热衷于分享非前端的知识,带领切图仔逃离切图圈子,欢迎关注我,微信公众号:《鲫小鱼不正经》。欢迎点赞、收藏、关注,一键三连!!
一、理论讲解:日志与调试的重要性
在 Auto.js 脚本开发过程中,日志和调试是不可或缺的环节。就像开车需要仪表盘一样,开发脚本也需要实时了解程序的运行状态。日志不仅能帮助我们定位 bug,还能在脚本自动化运行时,记录关键数据,方便后续分析和优化。
1.1 日志的作用
- 问题定位:快速发现和定位代码中的错误。
- 数据追踪:记录关键变量和流程,便于复盘。
- 性能分析:通过日志分析脚本运行效率。
- 用户反馈:在自动化脚本中,日志可作为用户反馈窗口。
- 安全审计:记录关键操作,便于追溯和合规。
1.2 调试的常见方式
- log/console 输出:最直接的调试方式。
- 断点调试:配合 IDE 或 Auto.js 内置调试工具。
- 文件日志:将日志写入本地文件,便于长期保存和分析。
- 弹窗提示:关键节点弹窗提醒,适合移动端调试。
- 日志可视化:通过悬浮窗、UI 面板实时查看日志。
- 远程调试:结合 adb logcat、scrcpy 等工具远程排查问题。
类比理解:日志就像"黑匣子",调试就像"医生查体",二者结合让你的脚本更健壮。
二、基础与进阶代码示例
2.1 基础 log 输出
log("脚本开始运行");
var a = 10;
log("变量 a 的值:" + a);
2.2 使用 console 对象
console.info("信息日志");
console.warn("警告日志");
console.error("错误日志");
2.3 文件日志写入
var logFile = files.join(files.getSdcardPath(), "autojs_log.txt");
files.append(logFile, new Date().toLocaleString() + " 脚本启动\n");
2.4 弹窗调试
toast("执行到这里了");
2.5 捕获异常并记录日志
try {
// 可能出错的代码
var result = 10 / 0;
} catch (e) {
log("发生异常:" + e);
files.append(logFile, "异常:" + e + "\n");
}
2.6 日志分级输出
function logInfo(msg) { log("[INFO] " + msg); }
function logWarn(msg) { log("[WARN] " + msg); }
function logError(msg) { log("[ERROR] " + msg); }
2.7 模块化日志工具
// modules/logger.js
function log(msg, level = "INFO") {
let line = `[${new Date().toLocaleTimeString()}][${level}] ${msg}`;
files.append("../logs/app.log", line + "\n");
if (level !== "DEBUG") toast(msg);
}
module.exports = { log };
2.8 日志可视化悬浮窗
"ui";
ui.layout(
<vertical>
<text id="logTitle" text="日志面板" textColor="#2196F3" textSize="18sp"/>
<scroll>
<text id="logContent" text="" textColor="#333333"/>
</scroll>
</vertical>
);
function appendLog(msg) {
ui.run(() => {
ui.logContent.setText(ui.logContent.text() + "\n" + msg);
});
}
log = appendLog; // 替换全局 log
三、实战项目1:异常捕获与日志上报
3.1 项目需求
开发一个自动化脚本,能够在运行过程中捕获所有异常,并将异常信息写入本地日志文件,同时通过微信推送到指定账号,方便远程监控。
3.2 项目源码
// autojs_log_report.js
var logFile = files.join(files.getSdcardPath(), "autojs_error_report.txt");
function writeLog(msg) {
var time = new Date().toLocaleString();
var logMsg = `[${time}] ${msg}\n`;
files.append(logFile, logMsg);
log(logMsg);
}
function sendWeChat(msg) {
var SCKEY = "你的Server酱SCKEY";
var url = `https://sc.ftqq.com/${SCKEY}.send`;
http.post(url, {
text: "Auto.js异常报告",
desp: msg
});
}
try {
writeLog("脚本开始运行");
var arr = [1, 2, 3];
log(arr[5].toString()); // 故意触发异常
} catch (e) {
writeLog("捕获到异常:" + e);
sendWeChat("捕获到异常:" + e);
}
writeLog("脚本运行结束");
3.3 运行效果
- 脚本运行时,所有日志和异常会被写入本地文件。
- 发生异常时,微信会收到推送提醒。
四、实战项目2:日志可视化与多级日志
4.1 项目需求
实现一个带有日志面板的悬浮窗工具箱,支持日志分级、实时查看、导出日志。
4.2 项目结构
autojs-logpanel/
├── main.js
├── modules/
│ └── logger.js
├── logs/
│ └── app.log
└── README.md
4.3 logger.js 代码
// modules/logger.js
function log(msg, level = "INFO") {
let line = `[${new Date().toLocaleTimeString()}][${level}] ${msg}`;
files.append("../logs/app.log", line + "\n");
events.broadcast.emit("log_update", line);
}
module.exports = { log };
4.4 main.js 代码
"ui";
const logger = require("./modules/logger.js");
ui.layout(
<vertical>
<button id="btnInfo" text="输出信息" />
<button id="btnWarn" text="输出警告" />
<button id="btnError" text="输出错误" />
<button id="btnExport" text="导出日志" />
<scroll>
<text id="logContent" text="" textColor="#333333"/>
</scroll>
</vertical>
);
ui.btnInfo.on("click", () => logger.log("普通信息", "INFO"));
ui.btnWarn.on("click", () => logger.log("警告信息", "WARN"));
ui.btnError.on("click", () => logger.log("错误信息", "ERROR"));
ui.btnExport.on("click", () => {
let logPath = files.join(files.getSdcardPath(), "autojs_log_export.txt");
files.write(logPath, ui.logContent.text());
toast("日志已导出到:" + logPath);
});
events.broadcast.on("log_update", line => {
ui.run(() => {
ui.logContent.setText(ui.logContent.text() + "\n" + line);
});
});
4.5 运行效果
- 日志分级输出,UI 面板实时显示。
- 支持一键导出日志,便于问题追踪。
五、分步详解与进阶技巧
5.1 日志分级与过滤
- 支持 DEBUG/INFO/WARN/ERROR/FATAL 多级日志。
- 通过 UI 面板筛选不同级别日志,开发调试更高效。
5.2 日志文件管理
- 日志按日期、功能模块分文件保存,便于归档和查找。
- 支持自动清理过期日志,防止文件过大。
5.3 性能分析与瓶颈定位
- 通过日志记录关键节点耗时,分析性能瓶颈。
- 结合时间戳、内存占用、CPU 使用率等信息,定位卡顿点。
5.4 移动端适配与权限
- 日志文件建议存储在 SD 卡或 app 专属目录,避免权限问题。
- UI 日志面板适配不同分辨率,支持横竖屏切换。
5.5 远程调试与 adb logcat
- 结合 adb logcat 查看系统级日志,辅助排查崩溃和权限问题。
- 支持通过 scrcpy 投屏实时观察脚本执行和日志输出。
5.6 日志与异常自动上报
- 结合 Server 酱、企业微信、钉钉等平台,异常自动推送。
- 支持邮件、短信等多渠道报警。
5.7 日志与数据分析
- 日志可导出为 CSV/JSON,便于后续数据分析和可视化。
- 支持日志聚合、统计、趋势分析。
5.8 日志与自动化测试
- 自动化测试用例执行时,详细记录每一步日志。
- 支持失败重试、异常回溯、测试报告生成。
六、常见问题与解决方案
| 问题 | 解决方案 |
|---|---|
| 日志丢失/未输出 | 检查文件路径、写入权限、log/console 是否被覆盖 |
| 日志刷屏/查找困难 | 合理设置日志等级,UI 面板支持筛选/搜索 |
| 文件日志过大 | 定期清理、分割日志文件,自动归档 |
| 日志内容乱码 | 确认编码格式为 UTF-8,避免特殊字符 |
| 异常未捕获/日志无记录 | 关键流程加 try-catch,日志写入加锁 |
| 日志导出失败 | 检查存储权限、路径是否正确 |
| UI 日志面板卡顿 | 日志分批加载,避免一次性渲染过多内容 |
| 日志推送失败 | 检查推送平台配置、网络连接 |
| 多线程日志冲突 | 日志写入加锁,避免并发写入 |
| 移动端适配问题 | UI 日志面板自适应分辨率,避免内容溢出 |
| 性能分析数据不全 | 关键节点加详细日志,结合系统监控工具 |
| 日志与主流程冲突 | 日志写入异步处理,避免阻塞主流程 |
| 日志文件丢失/损坏 | 定期备份日志,异常时自动恢复 |
| 日志内容泄露 | 敏感信息脱敏处理,日志加密存储 |
| 日志与数据存储冲突 | 日志与业务数据分开存储,避免互相影响 |
七、性能优化建议
- 日志输出频率控制,避免高频循环刷屏。
- 日志分级输出,开发阶段多输出,正式运行时降级。
- 文件写入批量处理,减少 IO 次数。
- 日志内容简洁明了,避免冗余。
- 日志文件自动归档、定期清理,防止文件过大。
- 日志写入异步处理,提升主流程响应。
- 日志与主流程解耦,避免阻塞。
- UI 日志面板分批加载,提升渲染效率。
- 日志与异常捕获结合,提升健壮性。
- 日志敏感信息脱敏,保障安全。
- 日志与性能分析结合,定位瓶颈。
- 日志与自动化测试结合,提升可追溯性。
- 日志与远程推送结合,提升监控能力。
- 日志与多线程安全结合,避免并发冲突。
- 日志与移动端适配结合,提升用户体验。
最后感谢阅读!欢迎关注我,微信公众号:
《鲫小鱼不正经》。欢迎点赞、收藏、关注,一键三连!!!