只推送影响系统可用性的critical error到企微/钉钉,需通过logback自定义appender实现精准过滤(error级别+critical标记)和http上报,并配置限流、脱敏、重试及健康监控。

明确目标:只推 Critical Error 到企微/钉钉
不是所有错误都值得发到群聊——只推送真正影响系统可用性的 Critical Error(如 JVM 崩溃前兆、核心线程池耗尽、数据库连接池全断、关键服务不可用等),避免消息轰炸。这要求 Appender 具备两个能力:精准过滤 + HTTP 上报。Logback 和 Log4j2 都支持自定义 Appender,推荐使用 Logback(Spring Boot 默认,配置更轻量、异步友好)。
Logback 自定义 Appender 实现推送逻辑
继承 ch.qos.logback.core.AppenderBase,重写 append() 方法,在其中判断日志级别和关键字,满足条件后构造 JSON 并调用企业微信/钉钉 Webhook:
- 检查
event.getLevel() == Level.ERROR且event.getFormattedMessage().contains("CRITICAL")或匹配自定义 marker(如logger.error(MarkerFactory.getMarker("CRITICAL"), "DB connection pool exhausted")) - 使用
OkHttpClient或RestTemplate发送 POST 请求,Body 为标准机器人格式(企微需含msgtype: "text"+text.content;钉钉需msgtype: "text"+text.content,建议加atMobiles或isAtAll: true) - 添加失败重试(最多 2 次)、超时控制(≤3s)、日志上报异常降级为本地文件记录(避免因网络问题丢关键日志)
配置 logback-spring.xml 启用并绑定
放在 src/main/resources 下,文件名必须为 logback-spring.xml(支持 Spring Profile):
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
<configuration><!-- 定义自定义 Appender --><appender name="DING_TALK" class="com.example.log.DingTalkAppender"><webhookurl>https://oapi.dingtalk.com/robot/send?access_token=xxx</webhookurl><atall>false</atall></appender><p><!-- 只让 CRITICAL 日志走此 Appender --> <logger name="com.example.system" level="ERROR" additivity="false"><appender-ref ref="DING_TALK"></appender-ref></logger></p> <p><!-- 根日志器保留文件/控制台输出 --> <root level="INFO"><appender-ref ref="FILE"></appender-ref><appender-ref ref="CONSOLE"></appender-ref></root></p></configuration>
注意:additivity="false" 防止日志重复发送(即不继承 root 的输出)。
安全与稳定性加固要点
生产环境不能裸奔:
- Webhook URL 必须从
application.yml注入,禁止硬编码;可用<springproperty scope="context" name="dingtalk.webhook" source="logging.dingtalk.webhook"></springproperty> - 添加限流:每分钟最多推送 5 条,超出则丢弃(用
RateLimiter或简单时间窗口计数) - 敏感字段脱敏:在发送前正则替换手机号、身份证、token 等(如
content.replaceAll("\d{11}", "****-****-****")) - 监控健康状态:暴露一个
/actuator/logpush/status端点,返回最近一次推送成功时间、失败次数、队列积压数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










