日志监控与告警系统在爬虫运维中的实践:从ELK到自研轻量方案

简介: 针对中小爬虫系统“静默崩溃”痛点,本文提出轻量级监控方案:基于Redis实现结构化日志收集、关键指标(请求成功率/采集量)聚合、规则驱动告警(如成功率<80%自动钉钉通知),无需ELK,部署简单、响应及时。(239字)

一、业务背景
爬虫系统最怕的是无声无息地挂了——你不知道它什么时候停止工作了,等发现的时候已经几个小时没有新数据了。
我最早用ELK(Elasticsearch + Logstash + Kibana)做日志监控,但ELK太重了——三个组件都要部署和维护,对于中小规模的爬虫系统来说有点大材小用。
二、轻量级日志收集方案
我设计了一个更轻量的方案:
python
import loggingimport jsonimport redisimport timeclass StructuredLogger: """结构化日志记录器""" def init(self): self.redis = redis.Redis(decode_responses=True) self.log_key = "crawler:logs" def log(self, level, message, kwargs): log_entry = { 'timestamp': time.time(), 'level': level, 'message': message, kwargs } # 写入Redis List(最新的在最前面) self.redis.lpush(self.log_key, json.dumps(log_entry)) # 只保留最近10000条 self.redis.ltrim(self.log_key, 0, 9999) # 同时输出到控制台(开发环境) print(f"[{level}] {message}")# 使用logger = StructuredLogger()logger.log('INFO', '爬虫启动', spider='rakuten', worker_id=1)logger.log('ERROR', '请求失败', url='https://api.rakuten.co.jp', status_code=500)
三、关键指标监控
除了日志,还需要监控关键业务指标:
python
class MetricsCollector: def init(self): self.redis = redis.Redis(decode_responses=True) def record_request(self, platform, success=True): """记录请求""" key = f"metrics:requests:{platform}:{time.strftime('%Y%m%d%H')}" self.redis.hincrby(key, 'total', 1) if not success: self.redis.hincrby(key, 'failed', 1) self.redis.expire(key, 86400 7) # 保留7天 def record_item(self, platform, count=1): """记录采集到的商品数""" key = f"metrics:items:{platform}:{time.strftime('%Y%m%d%H')}" self.redis.hincrby(key, 'count', count) self.redis.expire(key, 86400 7) def get_recent_metrics(self, platform, hours=24): """获取最近N小时的指标""" metrics = [] for i in range(hours): hour = (time.time() - i 3600) hour_str = time.strftime('%Y%m%d%H', time.localtime(hour)) key = f"metrics:requests:{platform}:{hour_str}" data = self.redis.hgetall(key) if data: metrics.append({ 'hour': hour_str, 'total': int(data.get('total', 0)), 'failed': int(data.get('failed', 0)) }) return metrics
四、告警规则引擎
基于收集的指标,配置告警规则:
python
class AlertEngine: def init(self, metrics_collector): self.metrics = metrics_collector self.rules = [] self.alerted = {} # 记录已触发的告警,防止重复 def add_rule(self, rule): """添加告警规则""" self.rules.append(rule) def check(self): """定期检查所有规则""" for rule in self.rules: if self._evaluate_rule(rule): self._send_alert(rule) def _evaluate_rule(self, rule): """评估规则是否触发""" # 规则示例:{"platform": "rakuten", "metric": "success_rate", "threshold": 0.8, "window": 60} metrics = self.metrics.get_recent_metrics( rule['platform'], hours=rule.get('window', 1) ) total = sum(m['total'] for m in metrics) failed = sum(m['failed'] for m in metrics) if total == 0: # 没有请求,可能爬虫已停止 return rule.get('alert_on_zero', False) success_rate = (total - failed) / total return success_rate < rule['threshold']
五、告警通知
python
class AlertNotifier: def init(self): self.webhook_url = os.getenv('DINGTALK_WEBHOOK') def send(self, rule, metrics): message = f""" 【爬虫告警】 平台: {rule['platform']} 规则: {rule['description']} 当前成功率: {metrics['success_rate']:.2%} 阈值: {rule['threshold']:.2%} 时间: {time.strftime('%Y-%m-%d %H:%M:%S')} """ # 发送到钉钉/飞书/企业微信 requests.post(self.webhook_url, json={'text': message})
六、总结
轻量级监控方案的核心是:结构化日志 + 关键指标 + 告警规则。这套方案不需要部署ELK这样重量的组件,用Redis就能搞定,适合中小规模的爬虫系统。
第17篇
RabbitMQ在分布式订单系统中的三种交换器使用场景
一、业务背景
在跨境电商订单系统中,不同模块之间需要异步通信。RabbitMQ提供了四种交换器(Exchange)类型,每种适用于不同的场景。
二、Direct Exchange:精准路由
Direct Exchange根据Routing Key精确匹配队列。
python
import pikaclass DirectExchangeExample: def init(self): self.connection = pika.BlockingConnection( pika.ConnectionParameters('localhost') ) self.channel = self.connection.channel() # 声明Direct Exchange self.channel.exchange_declare( exchange='order_direct', exchange_type='direct' ) def setup_queues(self): # 不同优先级的订单走不同队列 self.channel.queue_declare('order_high_priority') self.channel.queue_declare('order_normal_priority') self.channel.queue_declare('order_low_priority') # 绑定 self.channel.queue_bind( exchange='order_direct', queue='order_high_priority', routing_key='high' ) self.channel.queue_bind( exchange='order_direct', queue='order_normal_priority', routing_key='normal' ) self.channel.queue_bind( exchange='order_direct', queue='order_low_priority', routing_key='low' ) def publish_order(self, order, priority='normal'): self.channel.basic_publish( exchange='order_direct', routing_key=priority, body=json.dumps(order) )
使用场景:不同优先级的订单(VIP用户、普通用户、批量订单)分开处理。
三、Topic Exchange:模糊匹配
Topic Exchange根据通配符匹配Routing Key。
python
class TopicExchangeExample: def init(self): self.channel.exchange_declare( exchange='order_topic', exchange_type='topic' ) def setup_queues(self): # 日本订单队列 self.channel.queue_declare('order_jp') self.channel.queue_bind( exchange='order_topic', queue='order_jp', routing_key='order.jp.
' ) # 美国订单队列 self.channel.queue_declare('order_us') self.channel.queue_bind( exchange='order_topic', queue='order_us', routing_key='order.us.*' ) # 所有订单的日志队列 self.channel.queue_declare('order_log') self.channel.queue_bind( exchange='order_topic', queue='order_log', routing_key='order.#' # #匹配任意多个词 )
使用场景:按地域(国家、地区)路由订单,同时有一个全局日志队列。
四、Fanout Exchange:广播
Fanout Exchange把消息广播给所有绑定的队列。
python
class FanoutExchangeExample: def init(self): self.channel.exchange_declare( exchange='order_fanout', exchange_type='fanout' ) def setup_queues(self): # 所有消费者都收到同样的消息 self.channel.queue_declare('order_storage') # 存储服务 self.channel.queue_declare('order_notify') # 通知服务 self.channel.queue_declare('order_analytics') # 分析服务 self.channel.queue_bind('order_storage', 'order_fanout') self.channel.queue_bind('order_notify', 'order_fanout') self.channel.queue_bind('order_analytics', 'order_fanout') def publish_order(self, order): # 所有绑定的队列都会收到 self.channel.basic_publish( exchange='order_fanout', routing_key='', # Fanout忽略routing_key body=json.dumps(order) )
使用场景:订单状态变更需要通知多个服务(存储、通知、分析、日志)。
五、Headers Exchange:复杂条件匹配
Headers Exchange根据消息头中的键值对匹配,支持更复杂的条件。
python
class HeadersExchangeExample: def init(self): self.channel.exchange_declare( exchange='order_headers', exchange_type='headers' ) def setup_queues(self): # 大额订单队列 self.channel.queue_declare('order_large') self.channel.queue_bind( exchange='order_headers', queue='order_large', arguments={ 'x-match': 'all', # 所有条件都满足 'amount': 'large', 'status': 'paid' } ) # 紧急订单队列 self.channel.queue_declare('order_urgent') self.channel.queue_bind( exchange='order_headers', queue='order_urgent', arguments={ 'x-match': 'any', # 任一条件满足 'urgent': 'true', 'priority': 'high' } )
六、总结
四种交换器的选择原则:Direct用于精准路由、Topic用于模糊匹配、Fanout用于广播、Headers用于复杂条件。在跨境电商订单系统中,Direct用得最多(按订单类型路由),Fanout用于状态广播。

目录
相关文章
|
2月前
|
数据采集 存储 人工智能
数据资产化实施架构与技术路径:基于理采存管用的五阶段方法论深度解析
本文基于DCMM 2.0新增“数据资产”能力域,提出“理—采—存—管—用”五阶段工程化落地路径,融合标准解读、架构设计与真实案例,为数据架构师与治理负责人提供可执行的数据资产化实施指南。
|
2月前
|
网络协议 数据建模 应用服务中间件
阿里云新用户免费领取20张DV单域名证书,领取与部署流程参考
本文详细介绍了阿里云免费个人测试SSL证书的完整申请与部署流程,适用于已完成实名认证、域名ICP备案且服务器开放443端口的用户。流程分为三步:先在数字证书管理控制台领取免费证书,提交申请时推荐选择自动DNS验证,1-15分钟即可完成证书签发;再以CentOS 8.0+Nginx环境为例,演示证书上传、配置修改与重载的操作细节,确保HTTPS加密访问生效。同时提及阿里云付费SSL证书新用户6折起、新老用户同享8折起,配套自动托管、域名监控等增值服务,满足不同业务场景的安全需求。
|
2月前
|
人工智能 监控 测试技术
银行业AI架构:从裸调API到六层技能体系
# 银行AI智能体架构实战:从单体到Skill协同的技术演进 ## 痛点:银行IT架构的三重困境 走在任何一家银行的科技部走廊里,你都能听到同样的叹息:系统又慢了、需求又排不上、监管又来查了。这不是某一家银行的困境,而是整个银行业IT架构的共性问题。我们把它拆解为三重困境。 **困境一:单体系
|
2月前
|
人工智能 搜索推荐 机器人
《智能体三角模型白皮书》意图共鸣科技谈私有知识域与AI落地
私有知识域是专属于你的AI“大脑记忆库”:注入店铺地址、菜单、客户偏好等独家数据,让AI真正懂你——知道今天缺辣椒做不了辣椒炒肉,明白老客爱微辣、包厢空调故障。数据加密独享,千店千面,让AI从“通用工具”升级为“懂行的自己人”。
168 3
|
2月前
|
运维 安全 数据安全/隐私保护
终端应用无序使用暗藏数据风险,企业应用程序规范化管控落地实践方案
本文介绍终端安全管理系统的应用管控模块,从黑白名单、核心进程防护、软件全周期管理、脚本服务管控等六大维度,实现精细化权限控制与风险拦截。支持白/黑名单、数字指纹校验、审批安装、内部软件库分发等功能,兼顾安全与办公效率,助力企业筑牢终端应用安全防线。(239字)
|
2月前
|
消息中间件 安全 测试技术
StateFlow 与 SharedFlow:复杂页面状态管理的边界与落地
本文深入解析StateFlow与SharedFlow在复杂页面状态管理中的分工:StateFlow承载可恢复、需立即获取的UI状态(如列表数据、加载态),SharedFlow处理一次性UI事件(如导航、Toast)。倡导单一不可变UiState建模、原子更新、冷流生命周期感知共享,并结合Compose最佳实践,提升稳定性与可测性。
98 0
|
2月前
|
Web App开发 数据采集 iOS开发
Python爬虫的User-Agent轮换与浏览器指纹模拟实战
本文介绍日本代购爬虫的反爬策略:通过User-Agent池(随机/轮询/平台适配)、浏览器指纹模拟(多维度请求头)、随机化请求间隔及智能重试机制,构建高拟真度请求,有效绕过网站反爬检测,提升数据采集成功率。(239字)
304 1
|
2月前
|
运维 资源调度
多云环境下的出海架构:企业基础设施的合规性与运维治理实践
企业出海需构建稳定多云基础设施,但面临合规准入差异、跨境财务对账难、跨时区运维协同弱等治理挑战。本文提出标准化资源管理、财务内控闭环与高效SRE协同方案,助力企业降本增效,聚焦核心业务创新。
|
2月前
|
人工智能 资源调度 搜索推荐
智慧医院系统开发定制方案如何满足不同医院需求?
智慧医院定制开发立足医院差异化需求,通过模块化架构、流程重构、多端协同、系统集成与AI扩展能力,为大型综合医院、专科医院、社区医院及互联网医院提供个性化解决方案,助力医疗数字化持续演进。(239字)
|
2月前
|
数据采集 API 数据库
Python爬虫的增量抓取策略:如何高效处理百万级商品的数据更新
本方案针对日淘平台海量商品数据更新难题,提出高效增量抓取策略:基于时间戳、版本号或内容Hash精准识别变更项,并结合分级更新机制(按热度动态调整频次),将日均抓取量从百万级降至万级,效率提升超90%。
149 0