做自动化时间久了就会明白一个道理:流程写得好不如日志写得好。 流程出了错,日志清晰的话5分钟就能定位问题;日志稀烂的话,可能要花半天从头查起。
影刀的日志系统其实很强,但大部分人只用到了“输出日志”这一个功能。今天把日志系统的三层架构拆开讲——执行日志、运行报告、错误截图,外加一个自动生成日报的方案。
先说日志的三个层级
| 层级 | 内容 | 用途 | 保留时间 |
|---|---|---|---|
| L1-执行日志 | 每条指令的执行记录、变量值 | 实时排查、定位错误 | 7-30天 |
| L2-运行报告 | 流程摘要(开始/结束/耗时/状态/数据量) | 每日复盘、效果统计 | 长期保存 |
| L3-错误截图 | 出错时自动截屏 | 可视化排查、证据留存 | 30-90天 |
三个层级互相补充。排查问题时:先看运行报告确认哪个流程出问题了,再看执行日志定位具体哪一行,最后看错误截图确认当时页面是什么状态。
L1-执行日志:每条指令的“行车记录仪”
影刀RPA实操路径: 指令面板搜索“输出日志”,拖入画布。这是最基础的日志指令。
三种日志级别(在输出日志指令的详情面板里选择):
| 级别 | 颜色 | 使用场景 |
|---|---|---|
| 信息 | 蓝色 | 正常流程节点:开始、完成、数据量统计 |
| 警告 | 黄色 | 可恢复的异常:重试成功、元素未找到但跳过 |
| 错误 | 红色 | 不可恢复的异常:登录失败、数据写入失败 |
日志规范模板:
# ===== 每个子流程的标准日志结构 =====
# 1. 进入子流程
输出日志("【进入】子流程名称 | 参数:参数名=参数值")

# 2. 关键节点
输出日志("【进度】已处理 " + 当前数 + "/" + 总数)
# 3. 数据变更
输出日志("【数据】采集到 " + 新数据量 + " 条,累计 " + 累计量 + " 条")
# 4. 异常
输出日志("【异常】错误描述 | 当前URL:" + 当前页面URL)
# 5. 退出子流程
输出日志("【退出】子流程名称 | 耗时:" + 耗时 + "秒 | 状态:成功/失败")
一个完整的子流程日志示例:
# ========================================
# 子流程:Fetch_ProductList
# ========================================
输出日志("【进入】Fetch_ProductList | 关键词=手机 | 最大页数=5")
Try:
输出日志("【进度】开始搜索关键词:手机")
搜索关键词("手机")
等待元素加载("//div[@class='product-list']", 超时时间=10秒)

获取相似元素列表("//div[@class='product-item']", 存入列表=items)
商品数量 = 获取列表长度(items)
输出日志("【数据】搜索结果页采集到 " + 商品数量 + " 个商品")
如果 商品数量 == 0:
输出日志("【警告】搜索无结果,关键词可能无效或被屏蔽")
结束如果
输出日志("【进度】开始逐条采集商品详情...")
# ... 采集逻辑 ...
输出日志("【退出】Fetch_ProductList | 状态=成功 | 采集数=" + 商品数量)
Catch:
输出日志("【错误】Fetch_ProductList执行异常 | 错误信息:" + 获取错误信息())
输出日志("【退出】Fetch_ProductList | 状态=失败")
截图保存("error_Fetch_ProductList.png")
EndTry
L2-运行报告:每日复盘的核心
运行报告是流程执行完成后自动生成的摘要,告诉你这个流程跑了多久、处理了多少数据、有没有报错。
运行报告的生成方式:
# ===== 在流程开始处初始化报告数据 =====
设置变量(报告_开始时间 = 获取当前时间())
设置变量(报告_流程名称 = "淘宝商品采集")
设置变量(报告_执行状态 = "运行中")
设置变量(报告_总数据量 = 0)
设置变量(报告_错误次数 = 0)
设置变量(报告_错误列表 = [])
# ===== 流程执行过程中更新 =====
# 每采集一批数据就累加
设置变量(报告_总数据量 = 报告_总数据量 + 本次采集数)
# 发生错误时记录
如果 发生错误:
设置变量(报告_错误次数 = 报告_错误次数 + 1)
将 错误信息 加入列表(报告_错误列表)
结束如果
# ===== 流程结束处生成报告 =====
设置变量(报告_结束时间 = 获取当前时间())
设置变量(报告_耗时 = 计算时间差(报告_开始时间, 报告_结束时间))
如果 报告_错误次数 == 0:
设置变量(报告_执行状态 = "成功")
否则:
设置变量(报告_执行状态 = "部分成功")
如果 报告_总数据量 == 0:
设置变量(报告_执行状态 = "失败")
结束如果
结束如果
# ===== 写入运行报告表格 =====
报告行 = [
获取当前日期(),
报告_流程名称,
报告_执行状态,
报告_总数据量,
报告_错误次数,
报告_开始时间,
报告_结束时间,
报告_耗时,
报告_错误列表 # 转为文本
]
# 追加写入运行报告Excel
追加行数据到表格("C:/logs/运行报告.xlsx", 报告行)
# ===== 如果失败则发送通知 =====
如果 报告_执行状态 == "失败":
发送飞书消息(Webhook=告警群, 消息="【失败】" + 报告_流程名称 + " 执行失败,请查看日志")
结束如果
运行报告表格结构:
| 日期 | 流程名称 | 状态 | 数据量 | 错误数 | 开始时间 | 结束时间 | 耗时 | 错误摘要 |
|---|---|---|---|---|---|---|---|---|
| 2026-07-01 | 淘宝商品采集 | 成功 | 150 | 0 | 08:00 | 08:12 | 12分钟 | - |
| 2026-06-30 | 拼多多价格监控 | 部分成功 | 89 | 3 | 14:00 | 14:25 | 25分钟 | 3个商品采集超时 |
| 2026-06-29 | 小红书笔记采集 | 失败 | 0 | 1 | 10:00 | 10:05 | 5分钟 | 登录态失效 |
这个表格坚持记录一个月,就能看到哪些流程不稳定、哪些时间段容易出错。
L3-错误截图:可视化证据
光有日志文字不够,出错时看一眼截图就知道当时页面是什么状态——是加载失败、弹窗遮挡、还是页面改版了。
影刀RPA实操路径: 指令面板搜索“屏幕截图”,拖入Catch块中。
# ===== 错误截图的标准写法 =====
Try:
# 可能出错的指令
点击元素("//button[@id='submit']")
Catch:
# 1. 先截图
设置变量(截图时间 = 获取当前时间戳())
设置变量(截图路径 = "C:/logs/error_screenshots/" + 截图时间 + "_" + 流程名称 + ".png")
屏幕截图(保存路径=截图路径)
# 2. 再记录日志
输出日志("【错误】已保存截图:" + 截图路径)
# 3. 截图路径也写入运行报告
将 截图路径 加入列表(报告_错误截图列表)
EndTry
截图文件命名规范:
YYYYMMDD_HHMMSS_流程名称_错误类型.png
示例:20260701_083012_淘宝商品采集_元素未找到.png
容易踩的坑:
- 截图保存路径要确保存在。流程开始前用“创建文件夹”指令确认目录已存在。
- 社区版截图功能有限制,频繁截图可能失败。只在Catch块里截图,不要在循环内每轮都截。
日志自动清理策略
日志文件会越积越多,硬盘满了流程就跑不动了。日志需要定期清理。
清理策略:
| 日志类型 | 保留周期 | 清理方式 |
|---|---|---|
| 执行日志(影刀自动生成) | 30天 | 影刀客户端自动清理 |
| 运行报告(Excel) | 永久 | 年终归档,每年新建一个文件 |
| 错误截图 | 90天 | 流程中自动删除90天前的截图 |
自动清理脚本(放在流程开头执行):
# ===== 清理90天前的错误截图 =====
# 用Python代码在流程中定期清理
import os
import time
from datetime import datetime, timedelta
截图目录 = "C:/logs/error_screenshots/"
截止时间 = time.time() - 90 * 24 * 60 * 60 # 90天前的时间戳
for filename in os.listdir(截图目录):
filepath = os.path.join(截图目录, filename)
if os.path.isfile(filepath):
file_mtime = os.path.getmtime(filepath)
if file_mtime < 截止时间:
os.remove(filepath)
print("已删除旧截图:" + filename)
每日运行报告自动推送
每天早上8点,自动汇总昨天的所有运行记录,推送到飞书/企业微信群。
# ===== 子流程:Send_DailyReport =====
# 定时在每天早上8点执行
# 1. 读取昨天的运行报告
昨日日期 = 获取昨天日期()
读取Excel文件("C:/logs/运行报告.xlsx", 输出变量=all_records)
# 2. 筛选昨天的记录
设置变量(yesterday_records = [])
按列表循环(all_records, 循环项=row):
如果 row[0] == 昨日日期: # 第一列是日期
将 row 加入列表(yesterday_records)
结束如果
结束循环
# 3. 统计
总流程数 = 获取列表长度(yesterday_records)
成功数 = 0
失败数 = 0
总数据量 = 0
按列表循环(yesterday_records, 循环项=row):
如果 row[2] == "成功": # 第三列是状态
成功数 = 成功数 + 1
否则:
失败数 = 失败数 + 1
结束如果
总数据量 = 总数据量 + row[3] # 第四列是数据量
结束循环
# 4. 组装消息
消息 = """
📊 **RPA运行日报 - {昨日日期}**
━━━━━━━━━━━━━━━━━━
📋 执行流程数:{总流程数}
✅ 成功:{成功数}
❌ 失败:{失败数}
📦 总采集数据量:{总数据量} 条
{状态详情}
━━━━━━━━━━━━━━━━━━
"""
# 如果有失败的,单独列出来
如果 失败数 > 0:
状态详情 = "⚠️ 失败流程:"
按列表循环(yesterday_records, 循环项=row):
如果 row[2] != "成功":
状态详情 = 状态详情 + "\n - " + row[1] + "(" + row[8] + ")" # 流程名称+错误摘要
结束如果
结束循环
否则:
状态详情 = "✅ 所有流程执行正常"
结束如果
# 5. 发送
调用子流程(Send_FeishuNotification,
输入参数:
msg_type="info",
title="RPA运行日报 - " + 昨日日期,
content=消息,
mention_all=失败数 > 0 # 有失败才@所有人
)
常见问题速查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 日志里没有错误信息 | 没加输出日志指令 | 关键节点都要加输出日志 |
| 日志太多找不到关键信息 | 日志级别没区分 | 用信息/警告/错误三种级别 |
| 截图保存失败 | 目录不存在 | 流程开始前创建目录 |
| 运行报告Excel被占用 | 查看时流程也在写入 | 写入时先关闭表格 |
| 日志文件越来越大 | 没做清理 | 配置自动清理策略 |
| 第二天忘了看运行报告 | 没人提醒 | 配置自动推送日报 |
推荐资源
- 影刀官方《日志系统使用指南》——社区学院课程
- 我的日志模板文件:包含三个层级的日志标准写法,新流程直接复制粘贴框架
#影刀RPA #RPA自动化 #日志系统 #运行报告 #流程规范
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
