通过 fluentd、Elasticsearch 和 kibana 进行访问日志分析

简要概述
使用fluentd进行日志传输和收集,
使用Elasticsearch保存数据,
使用kibana进行数据可视化。
服务器配置
-
- APIサーバー(複数台)
-
- 【nginx】→【fluentd】→ログ収集サーバーへ転送
-
- ログ集約サーバー(兼 解析サーバー)
- APIサーバーから転送→【fluentd】→【Elasticsearch】⇔【kibana】
服务器设置
API服务器
Nginx:
Nginx (音译为“恩洽斯”):
假设已安装了Nginx。
将Nginx的访问日志转换为LTSV格式。
log_format ltsv 'time:$time_iso8601\t'
'remote_addr:$remote_addr\t'
'request:$request\t'
'request_method:$request_method\t'
'request_length:$request_length\t'
'request_uri:$request_uri\t'
'uri:$uri\t'
'query_string:$query_string\t'
'status:$status\t'
'bytes_sent:$bytes_sent\t'
'body_bytes_sent:$body_bytes_sent\t'
'referer:$http_referer\t'
'useragent:$http_user_agent\t'
'forwardedfor:$http_x_forwarded_for\t'
'request_time:$request_time\t'
'upstream_response_time:$upstream_response_time';
access_log logs/api.access.log ltsv;
流畅的日志传递工具
用yum安装fluentd
$ sudo vi /etc/yum.repos.d/treasuredata.repo
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
$ sudo yum install td-agent
$ sudo chkconfig td-agent on
安装fluentd的插件
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem update
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install
Fluentd的配置
$ sudo vi /etc/td-agent/td-agent.conf
# アクセスログの取得
<source>
type tail
# 自動で作成されないので作成しておく必要あり。でないと起動エラーになる
path /usr/local/nginx/logs/api.access.log
pos_file /var/log/td-agent/buffer/api.access.log.pos
# ここではltsvでなくnoneとする。集約サーバー側でltsvとして受け取るため。
format none
tag nginx.access
</source>
# 集約サーバーへ送信
<match *.**>
type forward
retry_limit 5
flush_interval 5s
<server>
host 10.100.10.100 # <- 集約サーバーのIPアドレス(ここではローカルIP)
port 24224
</server>
</match>
制作pos_file
$ cd /var/log/td-agent
$ sudo mkdir buffer
$ sudo touch /var/log/td-agent/buffer/api.access.log.pos
$ sudo chmod 777 /var/log/td-agent/buffer/api.access.log.pos
Fluentd开始执行
$ sudo /etc/init.d/td-agent start
# 必ずstatusで起動状態を確認する
$ sudo /etc/init.d/td-agent status
td-agent (pid 20332) is running...
集中服务器
EC2云服务器
使用 AWS 的 EC2 实例时,需要在安全组中允许 TCP 和 UDP 的 24224 端口。这个端口是用于 fluentd 的。
另外,在Kibana中使用TCP的5601端口,所以也需要允许该端口。
流畅咯
用yum命令安装Fluentd
*和上述的API服务器端相同。
安装 fluentd 的插件。
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-filter
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-forest
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-config-expander
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elasticsearch
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-typecast
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-parser
$ sudo yum install gcc-c++ libcurl-devel
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elasticsearch
流畅的日志收集程序Fluentd的设置
$ sudo vi /etc/td-agent/td-agent.conf
# ログの受信
<source>
type forward
port 24224
</source>
# 1) Elasticsearch用にパース処理
<match nginx.access>
type copy
<store>
type parser
format ltsv
time_key time
time_format %Y-%m-%dT%H:%M:%S%:z
add_prefix parsed
key_name message
</store>
# debug時のみ
<store>
type stdout
</store>
</match>
# パースしたデータをintegerにキャストする
<match parsed.nginx.access>
type typecast
item_types request_length:integer, status:integer, bytes_sent:integer, body_bytes_sent:integer, request_time:integer, upstream_response_time:integer
prefix casted
</match>
# パース・キャスト済みのデータをElasticsearchへ格納する
<match casted.parsed.nginx.access>
type_name nginx
type elasticsearch
include_tag_key true
tag_key @log_name
host localhost
port 9200
logstash_format true
flush_interval 10s
buffer_type file
buffer_path /var/log/td-agent/buffer/casted.nginx.access.buffer
</match>
弹性搜索
安装Elasticsearch
版本 1.7.1
※使用yum进行安装后,立即启动
elasticsearch dead but subsys locked
旁边,删除锁定文件然后再次尝试结果仍然相同。
我决定下载.tar.gz版本并使用它。
$ cd /var/www
$ sudo wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.1.tar.gz
$ sudo tar zxvf elasticsearch-1.7.1.tar.gz
版本2.0.0
$ sudo yum -y install https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.0.0-beta1/elasticsearch-2.0.0-beta1.rpm
$ sudo chkconfig elasticsearch on
设置内存
$ sudo vim /etc/sysconfig/elasticsearch
ES_HEAP_SIZE=1g # とりあえず。EC2のスペックによりけり。
启动Elasticsearch
# 1.7.1
$ sudo /var/www/elasticsearch-1.7.1/bin/elasticsearch &
# 2.0.0
$ sudo /etc/init.d/elasticsearch start
– 确认启动
$ curl -X GET http://localhost:9200/
只要返回类似以下的JSON数据就可以了。
{
"name" : "Jumbo Carnation",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.0.0-beta1",
"build_hash" : "bfa3e47383d0adc690329a2fa1094ceb64cae651",
"build_timestamp" : "2015-08-24T08:41:25Z",
"build_snapshot" : false,
"lucene_version" : "5.2.1"
},
"tagline" : "You Know, for Search"
}
由于Elasticsearch的数据不断增加,所以需要定期进行删除。
使用Curator很方便。
安装pip
$ curl https://bootstrap.pypa.io/get-pip.py | sudo python
安装 Curator
Elasticsearch 2.0.0不被支持。
$ sudo pip install elasticsearch-curator
$ curator --version
请帮我把下面的句子用中文进行本地化解释,只需一个选项:
例)
Can you help me with my homework?
只需使用以下命令,30天后关闭,60天后删除:
$ curator --host localhost close indices --prefix logstash --older-than 30 --time-unit days --timestring %Y.%m.%d
$ curator --host localhost delete indices --prefix logstash --older-than 60 --time-unit days --timestring %Y.%m.%d
Kibana——基本上是一个用于可视化和分析日志的工具。
安装 Kibana
版本4.1.1
$ cd /var/www/
$ sudo wget https://download.elastic.co/kibana/kibana/kibana-4.1.1-linux-x64.tar.gz
$ sudo tar zxvf kibana-4.1.1-linux-x64.tar.gz
$ sudo mv kibana-4.1.1-linux-x64 kibana
$ sudo chown -Rf ec2-user:ec2-user kibana
版本4.2.0
$ cd /var/www/
$ sudo wget https://download.elastic.co/kibana/kibana/kibana-4.2.0-beta1-linux-x64.tar.gz
$ sudo tar zxvf kibana-4.2.0-beta1-linux-x64.tar.gz
$ sudo mv kibana-4.2.0-beta1-linux-x64 kibana
$ sudo chown -Rf ec2-user:ec2-user kibana
设置Kibana
$ cd /var/www/kibana/
$ vi config/kibana.yml
elasticsearch.url: "http://localhost:9200"
开启Kibana
$ /var/www/kibana/bin/kibana &
使用浏览器打开Kibana
请将以下内容用中文进行本地化转述,仅需提供一种选项:
请将以下网址转为中文:http://****:5601/
基本认证设置
我决定使用nginx进行代理传输。
由于5601端口只能从本地访问,因此应从安全组中移除。
upstream kibana {
server 127.0.0.1:5601 fail_timeout=0;
}
server {
listen 80;
server_name kibana.example.com;
location / {
auth_basic "Restricted";
auth_basic_user_file /path/to/.htpasswd;
proxy_pass http://kibana;
}
}
重启nginx,如果可以浏览则完成。