如何使用Python通过Telegram Bot发送日志消息?
实现Python日志同时输出控制台和Telegram Bot
完全可行,利用Python标准库的logging模块自定义Handler,就能实现日志同时输出到控制台和Telegram Bot。以下是具体实现思路和代码示例:
1. 前期准备
- 创建Telegram Bot:打开Telegram,搜索
@BotFather,发送/newbot指令,按照提示创建Bot,最终会得到一个形如123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11的Bot Token。 - 获取目标聊天ID:给你的Bot发送一条消息,然后访问
https://api.telegram.org/bot<你的Bot Token>/getUpdates,在返回的JSON数据中找到chat.id字段值,这就是你要发送日志的目标聊天ID(可以是个人账号ID或群组ID)。
2. 核心实现思路
Python的logging模块支持添加多个Handler,每个Handler负责一种输出方式。我们可以自定义一个TelegramHandler,继承自logging.Handler,重写emit方法,在该方法中调用Telegram的API发送日志消息。同时保留默认的StreamHandler用于输出到控制台。
3. 具体代码实现
首先安装依赖库(用于调用Telegram API):
pip install requests
然后编写代码:
import logging import requests import os class TelegramHandler(logging.Handler): def __init__(self, bot_token, chat_id): super().__init__() self.bot_token = bot_token self.chat_id = chat_id self.api_url = f"https://api.telegram.org/bot{bot_token}/sendMessage" def emit(self, record): # 格式化日志消息 log_msg = self.format(record) # 避免消息过长被Telegram拒绝(Telegram单条消息上限4096字符) if len(log_msg) > 4096: log_msg = log_msg[:4093] + "..." try: requests.post( self.api_url, data={ "chat_id": self.chat_id, "text": log_msg, "parse_mode": "MarkdownV2" # 可选,支持Markdown格式 } ) except Exception as e: # 捕获发送异常,避免影响主程序运行 print(f"Telegram日志发送失败: {str(e)}") def setup_multi_output_logger(): # 创建logger实例 logger = logging.getLogger("multi_output_logger") logger.setLevel(logging.DEBUG) logger.propagate = False # 避免重复输出 # 配置控制台Handler console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) console_formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) console_handler.setFormatter(console_formatter) # 配置Telegram Handler(建议只发送WARNING及以上级别,减少消息量) bot_token = os.getenv("TELEGRAM_BOT_TOKEN") # 从环境变量读取,避免硬编码 chat_id = os.getenv("TELEGRAM_CHAT_ID") telegram_handler = TelegramHandler(bot_token, chat_id) telegram_handler.setLevel(logging.WARNING) telegram_formatter = logging.Formatter( "📝 **%(levelname)s**\n⏰ %(asctime)s\n📄 %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) telegram_handler.setFormatter(telegram_formatter) # 添加Handler到logger logger.addHandler(console_handler) logger.addHandler(telegram_handler) return logger # 使用示例 if __name__ == "__main__": # 先设置环境变量(实际使用中可以放在.env文件或系统环境变量里) os.environ["TELEGRAM_BOT_TOKEN"] = "你的Bot Token" os.environ["TELEGRAM_CHAT_ID"] = "你的聊天ID" logger = setup_multi_output_logger() logger.debug("这是调试日志,仅输出到控制台") logger.info("这是信息日志,仅输出到控制台") logger.warning("这是警告日志,控制台和Telegram都会收到") logger.error("这是错误日志,控制台和Telegram都会收到")
4. 注意事项
- 日志级别控制:建议给Telegram Handler设置较高的日志级别(如
WARNING或ERROR),避免大量调试消息刷屏。 - 消息长度限制:Telegram单条消息最多支持4096字符,代码中已做截断处理,若需发送超长日志,可以改用
sendDocument接口发送文本文件。 - 请求频率限制:Telegram API有请求频率限制,若日志量极大,建议添加消息缓存,批量发送,或使用异步请求库(如
aiohttp)优化。 - 安全性:不要将Bot Token和Chat ID硬编码在代码中,优先使用环境变量或加密配置文件存储。
- 异常处理:在
emit方法中一定要捕获异常,防止发送失败导致主程序崩溃。
内容的提问来源于stack exchange,提问作者Vivek Kumar Chauhan
相关产品推荐
相关产品推荐

