使用fluentd(fluent-plugin-elb-access-log)+Elasticsearch+kibana来将ELB的访问日志可视化
我有越来越多的机会对ELB日志进行分析…
$sed -e 's/:[0-9][0-9]\.[0-9][0-9][0-9][0-9][0-9][0-9]Z//g' access.log |awk -F " " '{ print $1,$8; }'| sort | uniq -c
可以创建并分析类似的命令,但是因为有点麻烦,所以我们会使用常见的工具组进行可视化。
构成
-
- Amazon Linux AMI 2015.03 (HVM)(S3へのRead権限を持ったIAMRoleが設定されていること)
-
- td-agent-2.2.0-0.x86_64
-
- ElasticSearch-1.4.5
-
- nginx-1.6.2-1.23.amzn1.x86_64
- Kibana3.1.2
此外,您需要提前启用ELB的访问日志。
请参考
-
- ELBのアクセスログをfluent-plugin-elb-logを使ってkibanaで表示する
-
- ELB s3 Log + Fluentd + Elasticsearch + Kibana + Ubuntu 14.04 LTS PV + EC2 on AWS
-
- [技術ブログVol.11] ELBのアクセスログをfluentd+Elasticsearch+kibanaで解析
-
- fluent-plugin-elb-access-logを作った
- fluentd-v2+elasticsearch+kibana3をEC2上で実施する
nginx 用于网站服务器的开源软件。
进行安装、启动服务、设置自动启动。
$sudo yum install nginx
$sudo service nginx start
$sudo chkconfig --add nginx
流畅的日志文件收集器。 de qì.)
安装,自动启动设置。
$curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sudo sh
$sudo chkconfig --add td-agent
为了获取ELB的访问日志,需要安装 fluent-plugin-elb-access-log,并安装 fluent-plugin-elasticsearch 将其注册到 Elasticsearch 中。此外,还需要先安装必要的软件包。
$sudo yum groupinstall 'Development tools'
$sudo yum install curl-devel
$sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch
$sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elb-access-log
ElasticSearch 弹性搜索
添加 GPG-KEY
$sudo rpm --import https://packages.elasticsearch.org/GPG-KEY-elasticsearch
为了添加存储库,请创建以下文件。
[elasticsearch-1.4]
name=Elasticsearch repository for 1.4.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.4/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=0
安装、服务启动、自动启动设置。
$sudo yum --enablerepo=elasticsearch-1.4 install elasticsearch
$sudo chkconfig --add elasticsearch
$sudo service elasticsearch start
确认启动的集群
$curl -s -XGET http://localhost:9200/_cluster/health | jq .
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}
使用fluentd获取ELB日志
使用 fluent-plugin-elb-access-log 来获取 ELB 的日志。
<source>
type elb_access_log
account_id 111111
region ap-northeast-1
s3_bucket toshihirock-elb-test
tag elb.access_log
debug true
</source>
<match **>
type stdout
</match>
各个设定的详细信息和选项,请参阅fluent-plugin-elb-access-log的README。
为了确认,我们将以追踪模式启动。
$sudo td-agent -vv &
在这种情况下,访问ELB的URL并等待一段时间。
如果成功的话,可以确认在标准输出中会显示日志,但是出现了以下的证书错误…
before_shutdown failed error="SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed"
我已经总结了关于这个问题的调查和解决方法,请参考以下内容。
在Fluentd的插件中遇到了证书验证失败的错误
請參考上述的詳細內容,這裡僅進行最終處理方式:更換證書。
# AmazonLinuxの証明書の位置を確認
$ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'
/etc/pki/tls/cert.pem
# バックアップ
$cp /opt/td-agent/embedded/ssl/cert.pem /opt/td-agent/embedded/ssl/cert.pem.original
# 差し替え
$cp /etc/pki/tls/cert.pem /opt/td-agent/embedded/ssl/cert.pem
一次,终止td-agent进程,然后重新运行。
$ps aux|grep ruby|awk '{print $2;}'|sudo xargs kill -KILL
$sudo td-agent -vv &
请再次访问ELB网站,并等待大约5分钟。
如果能够成功进行分析,则会输出日志。
2015-05-30 09:58:23 +0000 elb.access_log: {"timestamp":"2015-05-30T09:58:23.682447Z","elb":"LoadBlancer","client_port":3781,"backend_port":80,"request_processing_time":4.2e-05,"backend_processing_time":0.000791,"response_processing_time":2.7e-05,"elb_status_code":404,"backend_status_code":404,"received_bytes":0,"sent_bytes":3696,"request":"GET http://fuga:80/manager/html HTTP/1.1","client":"boyo","backend":"hoge","request.method":"GET","request.uri":"http://hogefuga:80/manager/html","request.http_version":"HTTP/1.1","request.uri.scheme":"http","request.uri.user":null,"request.uri.host":"abcd","request.uri.port":80,"request.uri.path":"/manager/html","request.uri.query":null,"request.uri.fragment":null}
确认工作完成后将结束进程。
$ps aux|grep ruby|awk '{print $2;}'|sudo xargs kill -KILL
将ELB的日志保存到ElasticSearch中。
我們將在 fluentd 的設定中添加關於 Elasticsearch 的內容,以便保存 ELB 的日誌。
<source>
type elb_access_log
account_id 11111111
region ap-northeast-1
s3_bucket toshihirock-elb-test
tag elb.access_log
debug true
</source>
<match elb.access_log>
type elasticsearch
type_name access_log
host localhost
port 9200
logstash_format true
include_tag_key true
tag_key @log_name
</match>
服务启动。
$sudo service td-agent start
我会访问 ELB 网站并检查日志。
$tail -f /var/log/td-agent.log
大约五分钟后,将会显示以下类似的日志。
2015-05-29 14:51:19 +0000 [info]: Connection opened to Elasticsearch cluster => {:host=>"localhost", :port=>9200, :scheme=>"http"}
首先,将获取当前存在的索引信息列表来确认是否真正已在ElastciSearch中注册。
$curl -XGET http://localhost:9200/_aliases?pretty
结果。
{
"logstash-2015.05.29" : {
"aliases" : { }
},
"logstash-2015.05.30" : {
"aliases" : { }
}
}
我会确认5月30日的情况。如果您事先没有安装jq,请执行sudo yum install jq命令,或者删除管道后面的命令。
$curl -XGET http://localhost:9200/logstash-2015.05.30/_search -d '
{
"query": {
"match_all" : {}
}
}' | jq .
结果
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 18,
"max_score": 1,
"hits": [
{
"_index": "logstash-2015.05.30",
"_type": "access_log",
"_id": "hogefuga",
"_score": 1,
"_source": {
"timestamp": "2015-05-30T10:34:08.552001Z",
"elb": "LoadBlancer",
"client_port": 54931,
"backend_port": 80,
"request_processing_time": 5.1e-05,
"backend_processing_time": 0.00074,
"response_processing_time": 2.1e-05,
"elb_status_code": 304,
"backend_status_code": 304,
"received_bytes": 0,
"sent_bytes": 0,
"request": "GET http://loadblancer-11111.ap-northeast-1.elb.amazonaws.com:80/ HTTP/1.1",
(以下略)
已经注册成功,没有问题。
Kibana: 可视化分析平台
Kibana的安装和配置。
$wget https://download.elastic.co/kibana/kibana/kibana-3.1.2.tar.gz
$tar -zxvf kibana-3.1.2.tar.gz
$mv kibana-3.1.2 kibana
$sudo mv kibana /usr/share/nginx/html
看起来,由于提升安全性的目的,需要添加一些设置从elasticsearch1.4开始。我们将会进行相应的添加。
$sudo vi /etc/elasticsearch/elasticsearch.yml
请将以下内容追加至末尾。
http.cors.allow-origin: "/.*/"
http.cors.enabled: true
此外,还需要检查SecurityGroup中的端口80和端口9200是否开放。端口9200似乎是用于Kibana查询的端口。
重新启动elasticsearch、nginx。
$sudo service elasticsearch restart
$sudo service nginx restart
在这种情况下,访问 http://[hostname]/kibana/ 就可以显示屏幕。