专栏首页云爬虫技术研究笔记日志太多怎么搞?一套爬虫监控系统全搞定!

日志太多怎么搞?一套爬虫监控系统全搞定!

作者: 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容器。结果如下图所示:

本文分享自微信公众号 - 云爬虫技术研究笔记(cloudcrawler),作者:Lateautumn4lin

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • %99的人都不知道的Docker技巧:优雅的终止容器

    如上的各种场景中,都要求打包在容器中的应用程序能够被优雅的终止(也即gracefully shutdown),这种gracefully shutdown的方式,...

    云爬虫技术研究笔记
  • Python2寿命只剩一个月啦!还不快赶紧学起Python3酷炫到爆的新特性!

    Python3.8已经发布了将近一个月了,距离Python3.0第一个版本发布也将超过10年了。相信很多人还是依旧在使用Python2.7版本,想要迁移到最新版...

    云爬虫技术研究笔记
  • 下一代容器架构已出,Docker何去何处?看看这里的6问6答!!

    我猜很多人一看这个标题已经感觉很懵逼了,什么?下一代容器都出来了,我还没学Docker呢!!!

    云爬虫技术研究笔记
  • 渗透痕迹分析随笔

    网上,关于入侵痕迹分析的文章很多,在此将个人工作中常用的一些方法技巧(班门弄斧了),以及爬过的坑总结如下(当然,其中有些方法也是从各位前辈的经验中学习的)。入侵...

    FB客服
  • 原创投稿 | 一键启动 filebeat 5.1.1 集成 logstash

    豌豆贴心提醒,本文阅读时间5分钟 “Eason,企业一线运维实战者,马哥教育原创作者联盟成员,热爱分享Linux应用技术的感想和原创知识。” Backgrou...

    小小科
  • django(一)基本的操作

    django 版本2.0.5 新建一个app 创建django app 我们先来了解一下一些必要的概念。Django 里什么东西叫 APP 呢?

    学到老
  • Hierarchical Disentangled Representations

    用户1908973
  • [Go] golang获取http中的get传递的参数

    此处备注一下 , 通过Request实例中获取URL , 然后调用URL的方法就可以了

    陶士涵
  • redis-server进程CPU百分百问题

    待确认是否为redis的BUG,原因是进程实际占用的内存远小于配置的最大内存,所以不会是内存不够需要淘汰。

    一见
  • 代码海洋-你想模仿的这里都有啊

    docker我们讲解很多次了,具体大家可以浏览我在在生信技能树上面写过部分docker教程, 目录如下:

    生信技能树

扫码关注云+社区

领取腾讯云代金券