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

aiofiles结合asyncio无法写入日志到文件问题排查(aiogram TG机器人)

问题排查结果

核心问题非常明确:你的两个日志函数在第一行就做了提前返回,后续所有文件操作代码根本没有执行机会,这就是全程无报错、但日志完全写不进去的直接原因。

具体问题点

  • 无效提前返回:writelog 函数第一行写了裸return,readlogs函数第一行写了return '',这两行代码会让函数在执行任何IO操作前就直接退出,后面的aiofiles打开文件、读写内容的逻辑全是永远不会运行的死代码,自然既不会写文件,也不会抛出任何IO错误。
  • 文件打开模式错误:writelog 里用的mode='w'是覆盖写入模式,每次调用都会清空文件原有内容,不符合日志追加留存的需求,就算去掉提前返回,最后文件里也只会保留最后一次写入的日志。
  • 缺少路径兼容和校验:原代码直接写相对路径assets/recently.txt,如果机器人启动时的工作目录不是logs.py所在的项目根目录,或者assets文件夹不存在,后续修复后也会触发文件找不到的报错。
  • 未指定文件编码:写入带emoji的日志内容(比如你传入的🔔字符)时,Windows环境下默认编码可能会触发编码报错。

修复方案

直接替换logs.py的内容为以下代码即可:

import aiofiles
from pathlib import Path

# 基于当前文件路径定位日志文件,避免工作目录不同导致路径错误
LOG_FILE = Path(__file__).parent / "assets" / "recently.txt"
# 自动创建不存在的assets目录
LOG_FILE.parent.mkdir(exist_ok=True, parents=True)

async def writelog(user_id: int, log: str):
    # 移除提前返回的无效代码,写入模式改为追加a,指定utf-8编码兼容emoji
    async with aiofiles.open(LOG_FILE, mode="a", encoding="utf-8") as f:
        await f.write(f"{user_id}:{log}\n")

async def readlogs():
    # 移除提前返回的无效代码,指定编码
    async with aiofiles.open(LOG_FILE, mode="r", encoding="utf-8") as f:
        return await f.read()

原有业务代码的调用方式不需要改动,修复后调用await writelog(message.from_user.id, 'turn off notifications🔔')就会正常向日志文件追加内容。

内容的提问来源于stack exchange,提问作者nevermore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:15:47