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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:45:34