企业微信机器人发送日志消息时,推荐在代码层按字节长度截断文本,优先使用 Markdown 类型消息提升可读性。适用场景为 CI/CD 通知或异常告警,风险边界是截断可能导致堆栈信息不完整。
先说结论:必须在发送前计算 UTF-8 字节长度,超过限制则截断或拆分,优先选用 Markdown 消息类型。
- 适合:CI/CD 流水线通知、应用异常告警、定时任务日志推送
- 先做:在代码中实现字节长度校验逻辑,而非字符数校验
- 再验证:确认企业微信后台返回 errcode 为 0 且消息完整显示
快速处理思路
无需复杂命令,核心是在发送请求前增加长度判断逻辑。以下 Python 示例展示如何安全截断:
import sys
def send_wecom_log(content, max_bytes=2048):
byte_content = content.encode('utf-8')
if len(byte_content) > max_bytes:
truncated = byte_content[:max_bytes-10].decode('utf-8', errors='ignore')
content = truncated + "\n...[内容过长已截断]"
# 执行发送请求
return content为什么会这样
企业微信机器人 API 对消息内容长度有硬性限制,超出限制会导致发送失败或内容被丢弃。
文本类型消息内容长度限制为 2048 字节,Markdown 类型消息内容长度限制为 4096 字节。中文字符在 UTF-8 编码下通常占用 3 个字节,直接按字符数截断可能导致字节超限或乱码。
分步处理
第一步:选择消息类型。普通文本适合简单通知,Markdown 适合包含代码块或加粗重点的日志。
第二步:实现字节计算。使用语言内置的 encode 方法获取 byte 长度,不要使用 len(string) 直接判断。
第三步:执行截断策略。保留头部关键信息,或头部 + 尾部省略中间,追加提示语“内容过长”。
第四步:处理发送异常。捕获 API 返回的 errcode,非 0 时记录本地日志以便排查。
怎么验证是否生效
查看企业微信聊天窗口,确认消息是否完整到达且无乱码。检查发送程序日志,确认 API 响应 body 中 errcode 字段值为 0。若使用 Markdown,确认代码块格式是否渲染正确。
常见坑
1. 按字符数截断:中文字符占用字节多,按字符数判断会导致实际字节超限。
2. 忽略频率限制:企业微信机器人有发送频率限制,大量日志轮询发送可能触发限流。
3. 特殊字符转义:Markdown 消息中需对下划线、星号等符号进行转义,否则格式会错乱。
常见问题
企业微信机器人消息长度限制是多少?
文本类型消息限制 2048 字节,Markdown 类型消息限制 4096 字节,具体以官方文档最新说明为准。
日志太长可以拆分多条发送吗?
可以,但需注意频率限制,建议合并关键错误信息后发送,避免刷屏。
为什么发送了但群里没显示?
检查机器人是否被移除群聊,或内容触发了安全拦截关键词。
参考来源
- 企业微信开发者文档,添加机器人,https://developer.work.weixin.qq.com/document/path/90236