比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

点击关注公众号,利用碎片时间学习

当我们公司内部部署很多服务以及测试、正式环境的时候,查看日志就变成了一个非常刚需的需求了。

是多个环境的日志统一收集,然后使用 Nginx 对外提供服务,还是使用专用的日志收集服务 ELK 呢?这就变成了一个问题!

比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
图片

而 Graylog 作为整合方案,使用 Elasticsearch 来存储,使用 MongoDB 来缓存,并且还有带流量控制的(throttling),同时其界面查询简单易用且易于扩展。所以,使用 Graylog 成为了不二之选,为我们省了不少心。

Filebeat 工具介绍

①Filebeat 日志文件托运服务

Filebeat 是一个日志文件托运工具,在你的服务器上安装客户端后,Filebeat 会自动监控给定的日志目录或者指定的日志文件,追踪读取这些文件,不停的读取,并且转发这些信息到 Elasticsearch 或者 Logstarsh 或者 Graylog 中存放。

②Filebeat 工作流程介绍

当你安装并启用 Filebeat 程序的时候,它会启动一个或多个探测器(prospectors)去检测你指定的日志目录或文件。

对于探测器找出的每一个日志文件,Filebeat 都会启动一个收割进程(harvester)。

每一个收割进程读取一个日志文件的最新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件。

最后 Filebeat 会发送集合的数据到你指定的地址上去(我们这里就是发送给 Graylog 服务了)。

③Filebeat 图示理解记忆

我们这里不适用 Logstash 服务,主要是因为 Filebeat 相比于 Logstash 更加轻量级。

当我们需要收集信息的机器配置或资源并不是特别多时,且并没有那么复杂的时候,还是建议使用 Filebeat 来收集日志。

日常使用中,Filebeat 的安装部署方式多样且运行十分稳定。

比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
图示服务架构理解记忆

Filebeat 配置文件

配置 Filebeat 工具的核心就是如何编写其对应的配置文件!

对应 Filebeat 工具的配置主要是通过编写其配置文件来控制的,对于通过 rpm 或者 deb 包来安装的情况,配置文件默认会存储在,/etc/filebeat/filebeat.yml 这个路径下面。

而对于,对于 Mac 或者 Win 系统来说,请查看解压文件中相关文件,其中都有涉及。

下面展示了 Filebeat 工具的主配置文件,注释信息中都对其各个字段含义进行了详细的解释,我这里就不再赘述了。

需要注意的是,我们将日志的输入来源统统定义去读取 inputs.d 目录下的所有 yml 配置。

所以,我们可以更加不用的服务(测试、正式服务)来定义不同的配置文件,根据物理机部署的实际情况具体配置。

# 配置输入来源的日志信息  
# 我们合理将其配置到了 inputs.d 目录下的所有 yml 文件  
filebeat.config.inputs:  
  enabled: true  
  path: ${path.config}/inputs.d/*.yml  
  # 若收取日志格式为 json 的 log 请开启此配置  
  # json.keys_under_root: true  
  
# 配置 Filebeat 需要加载的模块  
filebeat.config.modules:  
  path: ${path.config}/modules.d/*.yml  
  reload.enabled: false  
  
setup.template.settings:  
  index.number_of_shards: 1  
  
# 配置将日志信息发送那个地址上面  
output.logstash:  
  hosts: ["11.22.33.44:5500"]  
  
# output.file:  
#   enable: true  
  
processors:  
  - add_host_metadata: ~  
  - rename:  
      fields:  
        - from: "log"  
          to: "message"  
  - add_fields:  
      target: ""  
      fields:  
        # 加 Token 是为了防止无认证的服务上 Graylog 服务发送数据  
        token: "0uxxxxaM-1111-2222-3333-VQZJxxxxxwgX "  

下面展示一个简单的 inputs.d 目录下面的 yml 配置文件的具体内容,其主要作用就是配置单独服务的独立日志数据,以及追加不同的数据 tag 类型。

# 收集的数据类型  
- type: log  
  enabled: true  
  # 日志文件的路径地址  
  paths:  
    - /var/log/supervisor/app_escape_worker-stderr.log  
    - /var/log/supervisor/app_escape_prod-stderr.log  
  symlinks: true  
  # 包含的关键字信息  
  include_lines: ["WARNING", "ERROR"]  
  # 打上数据标签  
  tags: ["app", "escape", "test"]  
  # 防止程序堆栈信息被分行识别  
  multiline.pattern: '^[?[0-9]...{3}'  
  multiline.negate: true  
  multiline.match: after  
  
# 需要配置多个日志时可加多个 type 字段  
- type: log  
  enabled: true  
  ......  

需要注意的是,针对于不同的日志类型,filebeat 还提供了不同了模块来配置不同的服务日志以及其不同的模块特性,比如我们常见的 PostgreSQl、Redis、Iptables 等。

# iptables  
- module: iptables  
  log:  
    enabled: true  
    var.paths: ["/var/log/iptables.log"]  
    var.input: "file"  
  
# postgres  
- module: postgresql  
  log:  
    enabled: true  
    var.paths: ["/path/to/log/postgres/*.log*"]  
  
# nginx  
- module: nginx  
  access:  
    enabled: true  
    var.paths: ["/path/to/log/nginx/access.log*"]  
  error:  
    enabled: true  
    var.paths: ["/path/to/log/nginx/error.log*"]  

Graylog 服务介绍

①Graylog 日志监控系统

Graylog 是一个开源的日志聚合、分析、审计、展现和预警工具。在功能上来说,和 ELK 类似,但又比 ELK 要简单很多。

依靠着更加简洁,高效,部署使用简单的优势很快受到许多人的青睐。当然,在扩展性上面确实没有比 ELK 好,但是其有商业版本可以选择。

②Graylog 工作流程介绍

部署 Graylog 最简单的架构就是单机部署,复杂的也是部署集群模式,架构图示如下所示。

我们可以看到其中包含了三个组件,分别是 Elasticsearch、MongoDB 和 Graylog。

其中,Elasticsearch 用来持久化存储和检索日志文件数据(IO 密集),MongoDB 用来存储关于 Graylog 的相关配置,而 Graylog 来提供 Web 界面和对外接口的(CPU 密集)。

比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
最小化单机部署
比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
最优化集群部署

Graylog 组件功能

配置 Graylog 服务的核心就是理解对应组件的功能以及其运作方式!

简单来讲,Input 表示日志数据的来源,对不同来源的日志可以通过 Extractors 来进行日志的字段转换,比如将 Nginx 的状态码变成对应的英文表述等。

然后,通过不同的标签类型分组成不用的 Stream,并将这些日志数据存储到指定的 Index 库中进行持久化保存。

比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!比 ELK 更简洁、高效!企业级日志平台后起之秀 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 也能应付自如。

rule "discard debug messages"  
when  
  to_long($message.level) > 6  
then  
  drop_message();  
end  

日志集中保存到 Graylog 后就可以方便的使用搜索了。不过有时候还是需要对数据进行近一步的处理。

主要有两个途径,分别是直接访问 Elastic 中保存的数据,或者通过 Graylog 的 Output 转发到其它服务。

服务安装和部署

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

比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
使用 Graylog 来收集日志

①部署 Filebeat 工具

官方提供了多种的部署方式,包括通过 rpm 和 deb 包安装服务,以及源代码编译的方式安装服务,同时包括了使用 Docker 或者 kubernetes 的方式安装服务。

我们根据自己的实际需要,进行安装即可:

# 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  
# 使用 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 服务生成等相关信息,生成部署如下所示:

# 生成 password_secret 密码(最少 16 位)  
$ sudo apt install -y pwgen  
$ pwgen -N 1 -s 16  
zscMb65...FxR9ag  
  
# 生成后续 Web 登录时所需要使用的密码  
echo -n "Enter Password: " && head -1 </dev/stdin | tr -d 'n' | sha256sum | cut -d" " -f1  
Enter Password: zscMb65...FxR9ag  
77e29e0f...557515f  

生成所需密码信息之后,我们将如下 yml 信息保存到 docker-comopse.yml 文件中,使用 docker-compose 命令启动该服务,即可完成部署。

之后,通过浏览器访问对应服务器地址的 9000 端口,即可登录主页。

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 里面了。

比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
使用 Graylog 来收集日志
# [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  
# [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 界面功能

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

比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
Graylog 界面功能

来源:escapelife.site/posts/38c81b25.html

推荐:

主流Java进阶技术(学习资料分享)

比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。“在看”支持我们吧!

原文始发于微信公众号(Java笔记虾):比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!