如何捕获Python logging逐行日志存入变量并发送到Pyrogram聊天
你之前的代码不生效有两个核心原因:
logging.debug()这类方法本身返回值为None,无法直接通过赋值拿到日志内容- 把Handler初始化逻辑写在异常捕获块内,会导致每次触发异常都重复添加Handler,且StringIO的方案无法实现实时逐行捕获触发推送
实现步骤
1. 自定义日志Handler
直接继承logging.Handler类,重写emit方法,每生成一条符合级别要求的日志时,自动触发Pyrogram消息发送:
import logging from pyrogram import Client # 初始化你的Pyrogram客户端,替换为你自己的参数 app = Client("my_bot", api_id=12345, api_hash="xxx", bot_token="xxx") LOG_CHAT_ID = 123456789 # 替换为你要发送日志的聊天ID class PyrogramLogHandler(logging.Handler): def emit(self, record): # 格式化日志内容 log_msg = self.format(record) # 防止发送过程中出现异常导致主程序崩溃,加一层异常捕获 try: app.send_message(chat_id=LOG_CHAT_ID, text=log_msg) except Exception as e: # 可选:将发送失败的问题输出到控制台,避免静默失败 print(f"日志发送失败: {str(e)}")
2. 全局配置日志
在程序启动时一次性完成日志配置,同时保留控制台输出的能力:
def init_logger(): logger = logging.getLogger() # 设置全局日志级别,低于该级别的日志会被忽略 logger.setLevel(logging.DEBUG) # 定义日志格式,和你之前的需求保持一致 formatter = logging.Formatter( "📅 %(asctime)s 🔳 ⚠ #%(levelname)s 🔳 📝 %(message)s", datefmt='%Y-%m-%d %H:%M:%S' ) # 添加控制台输出Handler console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) console_handler.setLevel(logging.DEBUG) # 控制台输出所有DEBUG及以上级别日志 logger.addHandler(console_handler) # 添加Pyrogram推送Handler tg_handler = PyrogramLogHandler() tg_handler.setFormatter(formatter) # 如果只需要推送错误及以上级别的日志,就改成logging.ERROR tg_handler.setLevel(logging.ERROR) logger.addHandler(tg_handler) # 程序启动时调用一次即可 init_logger()
3. 异常捕获时正常打日志即可
不需要额外处理日志捕获逻辑,直接调用logging对应方法就会自动触发控制台输出+TG推送:
try: func() except Exception as e: # exc_info=True会自动把异常栈信息加入日志内容 logging.error("函数执行出错", exc_info=True)
注意事项
- 不要在每次异常捕获时重复初始化Handler和日志配置,否则会导致同一条日志重复推送多次
- 如果日志内容过长超过Telegram消息长度限制(4096字符),可以自行拆分后发送或者改成发送文件
- Pyrogram客户端需要先完成登录/初始化,再调用
send_message方法,建议在客户端启动完成后再初始化日志Handler

内容的提问来源于stack exchange,提问作者Ali Abdi
相关产品推荐
相关产品推荐

