关于日志管理:企业级日志平台新秀比-ELK-更轻量更高效

3次阅读

共计 7133 个字符,预计需要花费 18 分钟才能阅读完成。

当咱们公司外部部署很多服务以及测试、正式环境的时候,查看日志就变成了一个十分刚需的需要了。是多个环境的日志对立收集,而后应用 Nginx 对外提供服务,还是应用专用的日志收集服务 ELK 呢?这就变成了一个问题!

而 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 的装置部署形式多样且运行非常稳固。

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 密集)。

最小化单机部署

最优化集群部署

Graylog 组件性能

配置 Graylog 服务的外围就是了解对应组件的性能以及其运作形式!

简略来讲,Input 示意日志数据的起源,对不同起源的日志能够通过 Extractors 来进行日志的字段转换,比方将 Nginx 的状态码变成对应的英文表述等。

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

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 的装置步骤和注意事项!

部署 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 外面了。

# [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 界面的相干性能和对应特点!

作者:Escape
起源:escapelife.site/posts/38c81b25.html

正文完
 0