作者: Lateautumn4lin来源:云爬虫技术研究笔记
前言
很多读者也咨询过我怎么去监控爬虫系统的日志?这里我们给出一个通用的轻量级监控系统架构方式---ELK+Filebeat+Docker,都知道分布式爬虫系统是由一个高可用的控制中心配合多个弹性工作节点组成,假定我们现在把各个工作节点封装成Docker镜像,那么我们通过监控Docker容器的状态来监控爬虫系统了。
使用docker搭建elk
1、使用docker-compose文件构建elk。文件如下:
version: '3'
services:
elk:
image: sebp/elk:640
ports:
- "5601:5601"
- "9200:9200"
- "5044:5044"
environment:
- ES_JAVA_OPTS=-Xms512m -Xmx512m
volumes:
- ~dockerdata/elk:/var/lib/elasticsearch
2、执行docker-compose up -d 启动elk。可以使用docker logs 命令查看elk启动日志。启动成功后打开浏览器访问 http://127.0.0.1:5601
filebeat安装与配置
关于filebeat本文也不做过多介绍。只讲解安装与配置。
1、filebeat的docker-composep
version: '3'
services:
filebeat:
image: prima/filebeat:6
#restart: always
volumes:
- ./config/filebeat.yml:/filebeat.yml
- ~/dockerdata/filebeat:/data
- /var/lib/docker/containers:/var/lib/docker/containers
挂载说明
filebeat.yml配置需要在本地有对应文件,稍后会说到
filebeat抓取日志进度数据,挂载到本地,防止filebeat容器重启,所有日志重新抓取
因为要收集docker容器的日志,所以要挂在到docker日志存储目录,使它有读取权限
2、filebeat配置文件设置
在docker-compose.yml同级目录新建config文件夹
在config文件下新建filebeat.yml文件,文件内容如下:
filebeat.prospectors:
- type: log
enabled: true
paths:
- /var/lib/docker/containers/*/*.log #需要读取日志的目录#
json.keys_under_root: true # 因为docker使用的log driver是json-file,因此采集到的日志格式是json格式,设置为true之后,filebeat会将日志进行json_decode处理
json.add_error_key: true #如果启用此设置,则在出现JSON解组错误或配置中定义了message_key但无法使用的情况下,Filebeat将添加“error.message”和“error.type:json”键。
json.message_key: log #一个可选的配置设置,用于指定应用行筛选和多行设置的JSON密钥。如果指定,键必须位于JSON对象的顶层,且与键关联的值必须是字符串,否则不会发生过滤或多行聚合。
tail_files: true
# 将error日志合并到一行
multiline.pattern: '^([0-9]{4}|[0-9]{2})-[0-9]{2}'
multiline.negate: true
multiline.match: after
multiline.timeout: 10s
registry_file: /opt/filebeat/registry
-------------------------- Elasticsearch output ------------------------------
直接输出到elasticsearch,这里的hosts是elk地址,端口号是elasticsearch端口
output.elasticsearch:
hosts: ["10.9.70.62:9200"]
==================== Elasticsearch template setting ==========================
setup.template.name: "filebeat.template.json"
setup.template.fields: "filebeat.template.json"
setup.template.overwrite: true
setup.template.enabled: false
过滤掉一些不必要字段
processors:
-
drop_fields:
fields: ["input_type", "offset", "stream", "beat"]
在config文件下新建filebeat.template.json文件,文件内容如下:
{
"mappings": {
"_default_": {
"_all": {
"norms": false
},
"_meta": {
"version": "5.1.2"
},
"dynamic_templates": [
{
"strings_as_keyword": {
"mapping": {
"ignore_above": 1024,
"type": "keyword"
},
"match_mapping_type": "string"
}
}
],
"properties": {
"@timestamp": {
"type": "date"
},
"beat": {
"properties": {
"hostname": {
"ignore_above": 1024,
"type": "keyword"
},
"name": {
"ignore_above": 1024,
"type": "keyword"
},
"version": {
"ignore_above": 1024,
"type": "keyword"
}
}
},
"input_type": {
"ignore_above": 1024,
"type": "keyword"
},
"message": {
"norms": false,
"type": "text"
},
"meta": {
"properties": {
"cloud": {
"properties": {
"availability_zone": {
"ignore_above": 1024,
"type": "keyword"
},
"instance_id": {
"ignore_above": 1024,
"type": "keyword"
},
"machine_type": {
"ignore_above": 1024,
"type": "keyword"
},
"project_id": {
"ignore_above": 1024,
"type": "keyword"
},
"provider": {
"ignore_above": 1024,
"type": "keyword"
},
"region": {
"ignore_above": 1024,
"type": "keyword"
}
}
}
}
},
"offset": {
"type": "long"
},
"source": {
"ignore_above": 1024,
"type": "keyword"
},
"tags": {
"ignore_above": 1024,
"type": "keyword"
},
"type": {
"ignore_above": 1024,
"type": "keyword"
}
}
}
},
"order": 0,
"settings": {
"index.refresh_interval": "5s"
},
"template": "filebeat-*"
}
执行docker-compose up -d 启动filebeat。
在需要抓取docker日志的所有主机上按照以上步骤安装运行filebeat即可。到这一步其实就已经可以在elk里面建立索引查抓取到的日志。但是如果docker容器很多的话,没有办法区分日志具体是来自哪个容器,所以为了能够在elk里区分日志来源,需要在具体的docker容器上做一些配置,接着看下面的内容
docker容器设置
可以给具体的docker容器增加labels,并且设置logging。参考以下docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
# 设置labels
labels:
service: db
# logging设置增加labels.service
logging:
options:
labels: "service"
ports:
- "3306:3306"
重新启动应用,然后访问http://127.0.0.1:5601 重新添加索引。查看日志,可以增加过滤条件 attrs.service:db,此时查看到的日志就全部来自db容器。结果如下图所示:
号主介绍
前两年在二线大厂工作,目前在创业公司搬砖
接触方向是爬虫和云原生架构方面
有丰富的反爬攻克经验以及云原生二次开发经验
其他诸如数据分析、黑客增长也有所涉猎
做过百余人的商业分享以及多次开办培训课程
目前也是CSDN博客专家和华为云享专家
往期精彩回顾
震惊 | 只需3分钟!极速部署个人Docker云平台
深入理解Python的TLS机制和Threading.local()
我为什么不建议你使用Python3.7.3?
下一代容器架构已出,Docker何去何处?看看这里的6问6答!!
公众号内回复“私藏资料”即可领取爬虫高级逆向教学视频以及多平台的中文数据集