在之前的文章中,我介绍了如何使用 Filebeat 把一个日志文件直接写入到 Elasticsearch 中,或通过 Logstash 的方法写到 Elasticsearch 中。在今天的文章中,我们来介绍如何运用 Filebeat 来把 nginx 日志导入到 Elasticsearch 中,并进行分析。

Filebeat 模块为你提供了一种快速处理常见日志格式的快速方法。 它们包含默认配置,Elasticsearch 接收节点管道定义和 Kibana 仪表板,以帮助你实施和部署日志监视解决方案。

Filebeat 提供了几种不同的方式来启用模块。 你可以:

  • 在 modules.d 目录中启用模块配置
  • 运行 Filebeat 时 启用模块
  • 在 filebeat.yml 文件中启用模块配置

今天我们采用第一种方法来展示如何使用 Filebeat 所提供的模块功能来对 nginx 日志进行分析。

下载测试数据

我已经上传了一个测试数据,它位于:GitHub - liu-xiao-guo/nginx_log_file。我们可以通过如下的方法来下载这个测试数据:

git clone https://github.com/liu-xiao-guo/nginx_log_file

等我们把测试数据克隆下来后,我们可以通过如下的方法来解压,并把它存于到一个我们喜欢的目录中。

unzip nginx.zip

我们发现它里面含有一个叫做 nginx.log 的文件。它的大小有 227M。它里面含有1万个 nginx 的日志。

如何得到安装帮助

我们可以先打开我们的 Kibana,并点击 Kibana 左上角的 home 图标:

loki 采集nginx日志 filebeat采集nginx日志_loki 采集nginx日志

点击 “Add log data”,然后,我们可以看到:

loki 采集nginx日志 filebeat采集nginx日志_kibana_02

点击 “Nginx logs”,然后,你就就可以看到比较全的安装步骤:

loki 采集nginx日志 filebeat采集nginx日志_nginx_03

在上面,我们根据自己的平台选择适合自己的安装方式。

安装 Filebeat

我们可以根据不同的操作系统来进行如下不同的安装:

deb:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-amd64.deb
sudo dpkg -i filebeat-7.3.1-amd64.deb

rpm:
 

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
sudo rpm -vi filebeat-7.3.1-x86_64.rpm

mac:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-darwin-x86_64.tar.gz
tar xzvf filebeat-7.3.1-darwin-x86_64.tar.gz

brew:

brew tap elastic/tap
brew install elastic/tap/filebeat-full

linux:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-linux-x86_64.tar.gz
tar xzvf filebeat-7.3.1-linux-x86_64.tar.gz

这样我们的 Filebeat 就安装好了。请注意:由于ELK迭代比较快,我们可以把上面的版本 7.3.1 替换成我们需要的版本即可。我们先不要运行 Fliebeat。

使用 Filebeat 模块

当我们安装完 Filebeat 后,我们可以看到在 Filebeat 的安装目录下的文件结果如下:

$ pwd
/Users/liuxg/elastic/filebeat-7.3.0-darwin-x86_64
(base) localhost:filebeat-7.3.0-darwin-x86_64 liuxg$ ls -F
LICENSE.txt		filebeat.reference.yml	filebeat_es.yml
NOTICE.txt		filebeat.template.json	kibana/
README.md		filebeat.yml		logs/
data/			filebeat1.yml		module/
fields.yml		filebeat2.yml		modules.d/
filebeat*		filebeat_apache.yml	sample.log

在这里,我们可以看到它里面有一个叫做 filebeat.yml 的配置文件,还有一个叫做 modules.d 的文件夹。在 filebeat.yml 中,我们做如下的修改:

setup.kibana:
  host: "localhost:5601"

output.elasticsearch:
  hosts: ["localhost:9200"]

在这里,我们把 host 都指向我们的 localhost,这是因为我们的 elasticsearch 及 Kibana 都安装在本地的电脑上。这两个地址需要根据自己实际的部署的地址改变而改变。

显示 Filebeat 支持的模块

$ ./filebeat modules list
Enabled:
nginx

Disabled:
apache
auditd
cisco
coredns
elasticsearch
envoyproxy
googlecloud
haproxy
icinga
iis
iptables
kafka
kibana
logstash
mongodb
mssql
mysql
nats
netflow
osquery
panw
postgresql
rabbitmq
redis
santa
suricata
system
traefik
zeek

我们可以看出来目前已经被启动的模块是 nginx。它可以通过如下方式来启动:

./filebeat modules enable nginx

当然我们也可以通过如下的方式来关闭这个模块:

./filebeat modules disable nginx

针对我们今天的练习,我们需要启动 nginx 模块。

我们可以通过如下的命令查看在 modules.d 目录下的文件变化:

$ pwd
/Users/liuxg/elastic/filebeat-7.3.0-darwin-x86_64
(base) localhost:filebeat-7.3.0-darwin-x86_64 liuxg$ ls modules.d
apache.yml.disabled		mssql.yml.disabled
auditd.yml.disabled		mysql.yml.disabled
cisco.yml.disabled		nats.yml.disabled
coredns.yml.disabled		netflow.yml.disabled
elasticsearch.yml.disabled	nginx.yml
envoyproxy.yml.disabled		osquery.yml.disabled
googlecloud.yml.disabled	panw.yml.disabled
haproxy.yml.disabled		postgresql.yml.disabled
icinga.yml.disabled		rabbitmq.yml.disabled
iis.yml.disabled		redis.yml.disabled
iptables.yml.disabled		santa.yml.disabled
kafka.yml.disabled		suricata.yml.disabled
kibana.yml.disabled		system.yml.disabled
logstash.yml.disabled		traefik.yml.disabled
mongodb.yml.disabled		zeek.yml.disabled

我们可以看到 nginx.yml 文件的最后没有 “disabled” 字样,表明它已经被启动成功。我们进一步编辑这个 nginx.yml 文件:

# Module: nginx
# Docs: https://www.elastic.co/guide/en/beats/filebeat/7.3/filebeat-module-nginx.html

- module: nginx
  # Access logs
  access:
    enabled: true

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths: ["/Users/liuxg/data/nginx.log"]

  # Error logs
  error:
    enabled: true

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    #var.paths: ["/var/log/nginx/error.log"]

在这里,我把文件路径 /Users/liuxg/data/nginx.log 写入到该文件,这是因为我的 nginx.log 文件是位于这个路径的。这个路径需要你依据把 nginx 的日志文件路径改变而改变。

启动模块

为了能够使得我们的 nginx 模块能够正确地被 Kibana 显示,我们必须运行如下的命令:

./filebeat setup
$ pwd
/Users/liuxg/elastic/filebeat-7.3.0-darwin-x86_64
(base) localhost:filebeat-7.3.0-darwin-x86_64 liuxg$ ./filebeat setup
Index setup finished.
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards
Loaded machine learning job configurations
Loaded Ingest pipelines

注意:在安装或升级 Filebeat 时,或在启用新模块后,必须执行 setup 命令

运行 Filebeat

上面我们已经配置好,下面我们通过如下的命令来把我们的 nginx 日志导入到 Elasticsearch 中:

./filebeat -e

loki 采集nginx日志 filebeat采集nginx日志_elasticsearch_04

我们可以在 Kibana的 “Dev tools” 可以看到最新被创建的 index:

loki 采集nginx日志 filebeat采集nginx日志_nginx_05

这里的 filebeat-7.3.0 是一个 alias,它指向我们刚被创建的一个 index,比如 filebeat-7.3.0-2019.09.28-000001。

在这里显示的数据是10,000,其实这不是一个真实的文档的数目。它的真实的文档个数是:

loki 采集nginx日志 filebeat采集nginx日志_kibana_06

这里要注意的一件事是响应中的 hits.total。 它具有10,000和 “relation” =“ gte” 的值。 索引中实际上有 984,887 个文档,我们已经创建了全部。 在 7.0 版发布之前,hits.total 始终用于表示符合查询条件的文档的实际数量。 在 Elasticsearch 7.0 版中,如果匹配数大于10,000,则不会计算 hits.total。 这是为了避免为给定查询计算精确匹配文档的不必要开销。 我们可以通过将 track_total_hits = true 作为请求参数来强制进行精确匹配的计算。

一旦数据被导入到 Elasticsearch 中,我们就可以开始对数据进行分析了。

运用 Kibana 来分析数据

在之前我们已经通过 ./filebeat setup 命令,已经把针对 nginx 的模块仪表盘导入到 Kibana 中了。下面我们就可以使用标准的 dashboard 来对 nginx 数据进行展示及分析。

打开 Discover 查看数据,index pattern 选择 filebeat-*,把时间选择到2018年10月-2018年12月停止

loki 采集nginx日志 filebeat采集nginx日志_nginx_07