You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用计数器结合Python logging记录函数调用及特定触发事件

如何用计数器结合Python logging记录函数调用及特定触发事件

嘿,我来帮你搞定这个需求!你想要每次hello函数找到1.png时就用计数器记录,并把日志写到anomaly.log里对吧?先看看你现有代码里的几个小问题,再给你调整好的版本:

现有代码的几个小问题

  • 你在hello里重复调用了两次pyautogui.locateOnScreen,不仅效率低,还可能因为屏幕状态变化出现前后结果不一致的情况
  • 你的logger函数被schedule每1秒调用一次,每次都会重新配置logging、添加handler,这会导致日志重复输出,而且完全没必要——logging配置只需要做一次就行
  • hello里用的是logging.info,但没有使用你专门配置的那个logger实例,所以日志不会写到anomaly.log里
  • 日志只输出计数器数字,不够直观,最好加上描述性的信息

调整后的完整代码

import logging
import pyautogui
import schedule
import time

# 全局配置logging,只做一次就够
logger = logging.getLogger(__name__)
logger.propagate = False  # 避免日志传到根logger重复输出

# 配置anomaly.log的handler
handler = logging.FileHandler('anomaly.log')
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)  # 设置日志级别

def hello():
    # 只调用一次locateOnScreen,把结果存起来复用
    found = pyautogui.locateOnScreen('1.png', confidence=0.9)
    if found:
        hello.counter += 1
        # 用我们配置好的logger输出清晰的日志信息
        logger.info(f"成功找到1.png,当前累计次数:{hello.counter}")
    # 没找到的话可以选择不记录,或者也加个日志,看你需求

# 初始化函数计数器
hello.counter = 0

# 只需要调度hello函数,不需要调度logger函数
schedule.every(1).seconds.do(hello)

while True:
    schedule.run_pending()
    time.sleep(1)

关键调整点说明

  1. Logging配置全局化:把logging的配置放到代码开头,只执行一次,避免重复创建handler导致日志重复
  2. 复用查找结果:只调用一次pyautogui.locateOnScreen,把结果赋值给found,既提升效率又保证判断的一致性
  3. 使用指定logger输出:用我们创建的logger实例调用info方法,这样日志才会正确写到anomaly.log里
  4. 更清晰的日志内容:日志里加上描述性文字,方便后续查看时直接明白发生了什么
  5. 移除无用的调度:删掉了对logger函数的调度,因为logging配置不需要重复执行

这样调整后,每次hello找到1.png,计数器就会加1,同时一条清晰的日志会被写入anomaly.log里,完美符合你的需求~

备注:内容来源于stack exchange,提问作者D3AD_SHOT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 08:32:59