使用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/ 就可以显示屏幕。

广告
将在 10 秒后关闭
bannerAds