You need to enable JavaScript to run this app. discord.py开发:如何为warn命令实现日志记录并写入warnlogging.txt?
优惠活动
大模型
产品
解决方案
定价
更多

discord.py开发:如何为warn命令实现日志记录并写入warnlogging.txt?

带本地文本日志的warn命令实现

基础语法修正

你当前编写的命令存在语法问题:async def warn(...) 定义行末尾缺少冒号,直接运行会触发语法报错。

日志功能实现逻辑

你已经准备了warnlogging.txt作为存储文件,不需要引入数据库、结构化JSON等复杂方案。只需要在每次warn操作触发时,把关键操作信息按固定格式拼成单行文本,以追加写入的模式写入文件即可——这种方式适配warn操作的低频率特性,完全不会对机器人运行造成性能负担。
为了避免后续日志无法溯源,每条记录需要包含的核心信息:

  • 警告操作发生的具体时间
  • 操作所在的Discord服务器ID(避免多服务器共用机器人时日志混杂)
  • 执行警告的管理员账号信息
  • 被警告的成员账号信息
  • 本次警告的具体原因

完整可运行代码

首先导入实现需要的标准库,无需额外安装第三方依赖:

import discord
from discord.ext import commands
import datetime
import os

# 绑定日志文件的绝对路径,避免工作目录变动导致找不到文件
LOG_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "warnlogging.txt")

修正语法并加入日志功能的完整warn命令:

@client.command()
@commands.has_permissions(view_audit_log = True)
async def warn(ctx, member : discord.Member, *, reason="未填写警告原因"):
    # 拼接单行日志内容,方便后续读取、检索
    log_content = (
        f"[{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] "
        f"服务器ID:{ctx.guild.id} | "
        f"被警告成员:{member.name}(ID:{member.id}) | "
        f"执行管理员:{ctx.author.name}(ID:{ctx.author.id}) | "
        f"警告原因:{reason}\n"
    )
    # 以追加模式打开日志文件写入,不会覆盖原有历史记录
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(log_content)
    # 保留你原有命令的交互逻辑
    await ctx.send(f"Member warned. {ctx.author} warned {member} for the following reason: "+reason)
    await ctx.message.delete()

关键注意事项

  • 必须使用a(append)模式打开文件,如果用w模式,每次写入都会清空之前的所有历史警告记录
  • 写入时指定encoding="utf-8",避免中文、特殊符号写入时报编码错误
  • 日志内容末尾必须加\n换行符,否则所有历史日志会挤在同一行,无法区分单条记录
  • 日志文件路径通过脚本绝对路径拼接获取,避免机器人更换运行目录时提示找不到文件
  • 对reason参数设置默认值,避免用户触发warn命令时不填原因,导致拼接字符串时报NoneType类错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 10:45:04