替代ELK?分布式日志收集 后起之秀 Graylog

优采云 发布时间: 2022-04-23 08:19

  

  Graylog中的核心服务组件

  Graylog 通过 Input 搜集日志,每个 Input 单独配置 Extractors 用来做字段转换。Graylog 中日志搜索的基本单位是 Stream,每个 Stream 可以有自己单独的 Elastic Index Set,也可以共享一个 Index Set。

  Extractor 在 System/Input 中配置。Graylog 中很方便的一点就是可以加载一条日志,然后基于这个实际的例子进行配置并能直接看到结果。内置的 Extractor 基本可以完成各种字段提取和转换的任务,但是也有些限制,在应用里写日志的时候就需要考虑到这些限制。Input 可以配置多个 Extractors,按照顺序依次执行。

  系统会有一个默认的 Stream,所有日志默认都会保存到这个 Stream 中,除非匹配了某个 Stream,并且这个 Stream 里配置了不保存日志到默认 Stream。可以通过菜单 Streams 创建更多的 Stream,新创建的 Stream 是暂停状态,需要在配置完成后手动启动。Stream 通过配置条件匹配日志,满足条件的日志添加 stream ID 标识字段并保存到对应的 Elastic Index Set 中。

  Index Set 通过菜单 System/Indices 创建。日志存储的性能,可靠性和过期策略都通过 Index Set 来配置。性能和可靠性就是配置 Elastic Index 的一些参数,主要参数包括,Shards 和 Replicas。

  除了上面提到的日志处理流程,Graylog 还提供了 Pipeline 脚本实现更灵活的日志处理方案。这里不详细阐述,只介绍如果使用 Pipelines 来过滤不需要的日志。下面是丢弃 level > 6 的所有日志的 Pipeline Rule 的例子。从数据采集(input),字段解析(extractor),分流到 stream,再到 pipeline 的清洗,一气呵成,无需在通过其他方式进行二次加工。

  Sidecar 是一个轻量级的日志采集器,通过访问 graylog 进行集中式管理,支持 linux 和 windows 系统。Sidecar 守护进程会定期访问 graylog 的 REST API 接口获取 Sidecar 配置文件中定义的标签(tag) ,Sidecar 在首次运行时会从 graylog 服务器拉取配置文件中指定标签(tag) 的配置信息同步到本地。目前 Sidecar 支持 NXLog,Filebeat 和 Winlogbeat。他们都通过 graylog 中的 web 界面进行统一配置,支持 Beats、CEF、Gelf、Json API、NetFlow 等输出类型。Graylog 最厉害的在于可以在配置文件中指定 Sidecar 把日志发送到哪个 graylog 群集,并对 graylog 群集中的多个 input 进行负载均衡,这样在遇到日志量非常庞大的时候,graylog 也能应付自如。

  bash

   

rule "discard debug messages"

when

  to_long($message.level) > 6

then

  drop_message();

end

   

  日志集中保存到 Graylog 后就可以方便的使用搜索了。不过有时候还是需要对数据进行近一步的处理。主要有两个途径,分别是直接访问 Elastic 中保存的数据,或者通过 Graylog 的 Output 转发到其它服务。

  主要介绍部署 Filebeat + Graylog 的安装步骤和注意事项!

  使用Graylog来收集日志

  官方提供了多种的部署方式,包括通过 rpm 和 deb 包安装服务,以及源代码编译的方式安装服务,同时包括了使用 Docker 或者 kubernetes 的方式安装服务。我们根据自己的实际需要,进行安装即可。

  bash

   

# Ubuntu(deb)

$ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.1-amd64.deb

$ sudo dpkg -i filebeat-7.8.1-amd64.deb

$ sudo systemctl enable filebeat

$ sudo service filebeat start

   

  bash

   

# 使用docker启动

docker run -d --name=filebeat --user=root \

  --volume="./filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" \

  --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \

  --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \

  docker.elastic.co/beats/filebeat:7.8.1 filebeat -e -strict.perms=false \

  -E output.elasticsearch.hosts=["elasticsearch:9200"]

   

  

  使用Graylog来收集日志

  我们这里主要介绍使用 Docker 容器来部署服务,如果你需要使用其他方式来部署的话,请自行查看官方文档对应章节的安装部署步骤。在服务部署之前,我们需要给 Graylog 服务生成等相关信息,生成部署如下所示:

  bash

   

# 生成password_secret密码(最少16位)

$ sudo apt install -y pwgen

$ pwgen -N 1 -s 16

zscMb65...FxR9ag

# 生成后续Web登录时所需要使用的密码

$ echo -n "Enter Password: " && head -1 '\n' | sha256sum | cut -d" " -f1

Enter Password: zscMb65...FxR9ag

77e29e0f...557515f

   

  生成所需密码信息之后,我们将如下 yml 信息保存到 docker-comopse.yml 文件中,使用 docker-compose 命令启动该服务,即可完成部署。之后,通过浏览器访问对应服务器地址的 9000 端口,即可登录主页 。

  yaml

   

version: "3"

services:

  mongo:

    restart: on-failure

    container_name: graylog_mongo

    image: "mongo:3"

    volumes:

      - "./mongodb:/data/db"

    networks:

      - graylog_network

  elasticsearch:

    restart: on-failure

    container_name: graylog_es

    image: "elasticsearch:6.8.5"

    volumes:

      - "./es_data:/usr/share/elasticsearch/data"

    environment:

      - http.host=0.0.0.0

      - transport.host=localhost

      - network.host=0.0.0.0

      - "ES_JAVA_OPTS=-Xms512m -Xmx5120m"

    ulimits:

      memlock:

        soft: -1

        hard: -1

    deploy:

      resources:

        limits:

          memory: 12g

    networks:

      - graylog_network

  graylog:

    restart: on-failure

    container_name: graylog_web

    image: "graylog/graylog:3.3"

    ports:

      - 9000:9000 # Web服务提供的访问端口

      - 5044:5044 # Filebeat工具提供端口

      - 12201:12201 # GELF TCP

      - 12201:12201/udp # GELF UDP

      - 1514:1514 # Syslog TCP

      - 1514:1514/udp # Syslog UDP

    volumes:

      - "./graylog_journal:/usr/share/graylog/data/journal"

    environment:

      - GRAYLOG_PASSWORD_SECRET=zscMb65...FxR9ag

      - GRAYLOG_ROOT_PASSWORD_SHA2=77e29e0f...557515f

      - GRAYLOG_HTTP_EXTERNAL_URI=http://11.22.33.44:9000/

      - GRAYLOG_TIMEZONE=Asia/Shanghai

      - GRAYLOG_ROOT_TIMEZONE=Asia/Shanghai

    networks:

      - graylog

    depends_on:

      - mongo

      - elasticsearch

networks:

  graylog_network:

    driver: bridge

   

  需要注意的是,GELF(Graylog Extended Log Format) 的 input 模式可以接受结构化的事件,支持压缩和分块。恰好,Docker 服务的 log-driver 驱动原生提供了 GELF 的支持。只需要我们在 Graylog 的 system/inputs 下面创建对应的 input 之后,启动容器时候指定 log-driver,就可以将容器内的输出都会发送到 Graylog 里面了。

  使用Graylog来收集日志

  bash

   

# [docker] 启动容器指定地址和driver

docker run --rm=true \

    --log-driver=gelf \

    --log-opt gelf-address=udp://11.22.33.44:12201 \

    --log-opt tag=myapp \

    myapp:0.0.1

   

  yaml

   

# [docker-compose] 启动使用方式

version: "3"

services:

  redis:

    restart: always

    image: redis

    container_name: "redis"

    logging:

      driver: gelf

      options:

        gelf-address: udp://11.22.33.44:12201

        tag: "redis"

  ......

   

  主要介绍 Graylog 界面的相关功能和对应特点!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线