脚本小的时候,一个 MsgBox 就能看出问题;脚本稍微复杂一点,弹窗会打断流程,甚至影响问题复现。学会写日志,是 AHK 脚本从“能跑”到“好排查”的重要一步。

一、MsgBox:最直接,但会阻塞

#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force

value := 123
MsgBox, % "当前 value = " value
return

MsgBox 适合验证变量值、确认流程有没有走到某一步。但它会暂停脚本,自动化流程、定时器、窗口操作都可能被它影响。所以它适合临时调试,不适合作为长期日志。

二、ToolTip:轻量显示运行状态

SetTimer, ShowStatus, 1000
return

ShowStatus:
ToolTip, % "脚本运行中:" A_TickCount
return

ToolTip 不会像 MsgBox 那样卡住流程,适合显示当前状态、坐标、窗口标题、循环进度。但 ToolTip 内容会被覆盖,也不方便事后追查。

三、FileAppend:最常用的日志方式

Log("脚本启动")
Log("开始处理任务")
return

Log(msg) {
    logFile := A_ScriptDir "\run.log"
    FormatTime, now,, yyyy-MM-dd HH:mm:ss
    FileAppend, %now% - %msg%`n, %logFile%, UTF-8
}

FileAppend 适合长期记录。脚本出问题后,你可以打开日志文件,看它最后执行到了哪一步、变量是什么、错误发生在什么时候。

四、日志要带时间和级别

Log("INFO", "开始读取配置")
Log("WARN", "没有找到配置,使用默认值")
Log("ERROR", "目标窗口不存在")
return

Log(level, msg) {
    logFile := A_ScriptDir "\debug.log"
    FormatTime, now,, yyyy-MM-dd HH:mm:ss
    FileAppend, %now% [%level%] %msg%`n, %logFile%, UTF-8
}

级别不用太复杂,新手先用 INFOWARNERROR 就够了。真正排查问题时,带级别的日志比一堆普通文本更容易扫。

五、调试面板:运行中实时看日志

如果你不想一直打开日志文件,可以做一个简单 GUI 面板,把最近的日志显示出来。

Gui, Add, Edit, w600 h300 vLogBox ReadOnly
Gui, Show,, AHK 调试面板
AppendLog("脚本启动")
return

AppendLog(msg) {
    global LogBox
    FormatTime, now,, HH:mm:ss
    GuiControlGet, old,, LogBox
    GuiControl,, LogBox, % old now " - " msg "`r`n"
}

调试面板适合 GUI 工具、监控脚本、长时间运行的任务。正式使用时仍然建议同时写文件日志,因为 GUI 关闭后内容就没了。

六、日志文件别无限变大

RotateLog(logFile) {
    if !FileExist(logFile)
        return
    FileGetSize, size, %logFile%, K
    if (size > 1024) {
        FileMove, %logFile%, %logFile%.bak, 1
    }
}

常驻脚本要注意日志大小。可以按大小轮转,也可以按日期生成日志文件。不要让一个日志文件写到几百 MB。

七、建议

  • 临时看变量用 MsgBox。
  • 运行状态用 ToolTip。
  • 长期排查用 FileAppend。
  • 复杂工具可以加 GUI 调试面板。
  • 日志要写时间、级别和关键变量。
  • 常驻脚本要限制日志大小。

好日志不是写得越多越好,而是关键步骤、关键分支、错误位置都有记录。出问题时能顺着日志还原现场,就是合格的脚本日志。

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。