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

38ca7c4cc31f8e253be08409dd58315b.png

简要概述

使用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,如果可以浏览则完成。

广告
将在 10 秒后关闭
bannerAds