使用Embulk将Apache的访问日志导入Elasticsearch
我想做的事情
- Apacheのアクセスログを、可視化・分析するための環境を作りたい
用中文翻译如下:以「这件事」为题。
-
- すでにファイルとして存在するログを、Elasticsearchに放り込んで
- Kibanaで可視化するための準備を整える
我想试试做这件事。
如果要针对实时输出的日志进行操作,我认为通常会选择Fluend。但在此次情况下,我们要针对“已经存在的日志”进行操作,因此我想尝试使用批量加载器Embulk。
目标访问日志
刚好,我手头上有Apache的访问日志。保存了一段时间。
这个是通过logrotated处理的,按日期单位被压缩成.gz文件。
$ ls -1 accesslogs
access_log-20180602.gz
access_log-20180603.gz
access_log-20180604.gz
access_log-20180605.gz
access_log-20180606.gz
access_log-20180607.gz
access_log-20180608.gz
access_log-20180609.gz
access_log-20180610.gz
access_log-20180611.gz
access_log-20180612.gz
access_log-20180613.gz
access_log-20180614.gz
...
access_log-20181101.gz
access_log-20181102.gz
access_log-20181103.gz
access_log-20181104.gz
access_log-20181105.gz
access_log-20181106.gz
access_log-20181107.gz
access_log-20181108.gz
access_log-20181109.gz
access_log-20181110.gz
access_log-20181111.gz
access_log-20181112.gz
access_log-20181113.gz
...
access_log-20181201.gz
access_log-20181202.gz
access_log-20181203.gz
access_log-20181204.gz
access_log-20181205.gz
access_log-20181206.gz
access_log-20181207.gz
access_log-20181208.gz
access_log-20181209.gz
访问日志的内容大致是这样的。
172.19.33.212 - - [30/Nov/2018:05:44:37 +0900] "GET /signin HTTP/1.1" 200 8276 9986 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
172.24.35.22 - - [30/Nov/2018:07:39:46 +0900] "GET /styles/style.css HTTP/1.1" 304 - 11265 "http://example.com/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
172.24.35.22 - - [30/Nov/2018:07:39:46 +0900] "GET /images/logo.svg HTTP/1.1" 304 - 11978 "http://example.com/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
我们试着使用Embulk将这些日志文件导入Elasticsearch。
环境
这次的执行环境在这里。
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
$ java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-0ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
Embulk将在172.17.0.2运行,Elasticsearch和Kibana将在172.17.0.3上作为单节点运行。
安装 Embulk
我将按照 Embulk 的快速入门指南进行安装尝试。
Linux、Mac和BSD
$ curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar"
$ chmod +x ~/.embulk/bin/embulk
$ echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
安装Elasticsearch和Kibana。
安装Elasticsearch和Kibana。
请从下载页面获取并启动。
Elasticsearch。 – 弹性搜索。
$ $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.3.tar.gz
$ tar xf elasticsearch-6.5.3.tar.gz
$ cd elasticsearch-6.5.3
$ vim config/elasticsearch.yml # 設定変更
$ bin/elasticsearch
Elasticsearch将进行适用于单节点的配置更改。同时允许来自远程主机的访问。
network.host: 0.0.0.0
discovery.type: "single-node"
基本上是这样,但是您是否能够提供更多上下文信息?因为”Kibana”是一种软件工具,具体内容可能会有所不同。
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.3-linux-x86_64.tar.gz
$ tar xf kibana-6.5.3-linux-x86_64.tar.gz
$ cd kibana-6.5.3-linux-x86_64
$ vim config/kibana.yml # 設定変更
$ bin/kibana
Kibana允许来自远程主机的访问。
server.host: "0.0.0.0"
将Apache的访问日志扔进Elasticsearch。
我希望使用Embulk将Apache的访问日志投入到Elasticsearch中。
在这种情况下,您可以参考这个页面。
定期从CSV文件中加载批量数据到Elasticsearch + Kibana 5
为了将Embulk中的数据投入Elasticsearch,需要添加插件。
Embulk的Elasticsearch输出插件
$ embulk gem install embulk-output-elasticsearch
然后,我们以读取文件所放置的目录和输出目标设定作为种子进行创建。
种子.yml
in:
type: file
path_prefix: ./accesslogs
out:
type: elasticsearch
index: embulk
index_type: embulk
nodes:
- host: 172.17.0.3
Elasticsearch的索引名称和类型名称将被设置为embulk。
根据这个种子配置,运行”embulk guess”来生成配置文件。
$ embulk guess seed.yml -o config.yml
然后,里面变成了这样。
配置文件.yml
in:
type: file
path_prefix: ./accesslogs
decoders:
- {type: gzip}
parser:
charset: UTF-8
newline: LF
type: csv
delimiter: ;
quote: null
trim_if_not_quoted: false
skip_header_lines: 1
allow_extra_columns: false
allow_optional_columns: false
columns:
- {name: 'aaa.bbb.ccc.ddd - - [01/Nov/2018:03:13:14 +0900] "GET /index.html HTTP/1.1"
200 164373 614058 "-" "User-Agent"', type: string}
out:
type: elasticsearch
index: embulk
index_type: embulk
nodes:
- {host: 172.17.0.3}
Embulk guess会推测输入文件的格式和压缩类型等,但在格式方面有些奇怪的问题。
顺便说一下,这次访问日志的格式,实际上与默认格式有些许不同。
LogFormat "%h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" combined
让我们使用下列插件来解析这个页面。
Embulk的Apache CustomLog解析器插件
安装。
$ embulk gem install embulk-parser-apache-custom-log
将设置文件更改如下:在格式中直接填写日志格式。
配置文件.yml
in:
type: file
path_prefix: ./accesslogs
decoders:
- {type: gzip}
parser:
type: apache-custom-log
format: "%h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\""
out:
type: elasticsearch
index: embulk
index_type: embulk
nodes:
- {host: 172.17.0.3}
现在,使用这个配置文件开始执行。
$ embulk run config.yml
由于数据进入Kibana,因此使用“Discovery”对索引进行定义并显示。
时间字段是“请求时间”。
所以,数据已经录入了。
尽管…在搜索条件中包含了我们想要排除的日志。
可以通过类似Fluend的步骤进行数据加载,即输入→解析→输出的流程来实现。
插件有以下几种类型,可以用于输入输出和处理等方面的应用。
-
- Input plugin
-
- Output plugin
-
- Filter plugin
-
- File parser plugin
-
- File decoder plugin
-
- File formatter plugin
-
- File encoder plugin
- Executor plugin
配置/内置
Embulk插件