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
相关产品推荐
相关产品推荐

