Auto.js 入门指南(十)日志与调试技巧

411 阅读6分钟

日志与调试技巧

前言

大家好,我是鲫小鱼。是一名不写前端代码的前端工程师,热衷于分享非前端的知识,带领切图仔逃离切图圈子,欢迎关注我,微信公众号:《鲫小鱼不正经》。欢迎点赞、收藏、关注,一键三连!!


一、理论讲解:日志与调试的重要性

在 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 日志面板分批加载,提升渲染效率。
  • 日志与异常捕获结合,提升健壮性。
  • 日志敏感信息脱敏,保障安全。
  • 日志与性能分析结合,定位瓶颈。
  • 日志与自动化测试结合,提升可追溯性。
  • 日志与远程推送结合,提升监控能力。
  • 日志与多线程安全结合,避免并发冲突。
  • 日志与移动端适配结合,提升用户体验。

最后感谢阅读!欢迎关注我,微信公众号:《鲫小鱼不正经》。欢迎点赞、收藏、关注,一键三连!!!