Elasticsearch 是个开源分布式搜索引擎它的特点有分布式零配置自动发现索引自动分片索引副本机制 restful 风格接口多数据源自动搜索负载等。

Logstash 是一个完全开源的工具他可以对你的日志进行收集、分析并将其存储供以后使用如搜索。

kibana 也是一个开源和免费的工具他 Kibana 可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面可以帮助您汇总、分析和搜索重要数据日志。

日志从客户端到服务端处理后在传递给客户的数据流流向如下

Logstash-forwarder--->Logstash--->Elasticsearch--->kibana--->nginx--->客户浏览器

其中Logstash-forwarder是客户端的日志收集工具将日志发送给服务端Logstash后Logstash通过使用grok匹配规则对日志进行匹配切割然后保存在Elasticsearch中通过kibana从Elasticsearch中读取数据并转交给nginx来处理后返回给客户。

好了下面就是ELK系统的安装过程了。

下面是elasticsearch/logstash 所需JVM版本

首先安装JAVA环境

1
2
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.rpm"
rpm -Uvh jdk-8u65-linux-x64.rpm

或者直接yum安装jdk也行不过要保证安装好对应的版本。

当然也可以源码安装不过源码安装需要注意设置好环境变量

1
2
3
4
5
6
7
8
9
10
11
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.tar.gz"
tar zxvf jdk-8u65-linux-x64.tar.gz
mv jdk1.8.0_65 java
vi /etc/profile
JAVA_HOME="/usr/local/java" 
PATH=$JAVA_HOME/bin:$PATH 
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
export JAVA_HOME 
export PATH 
export CLASSPATH
source /etc/profile

安装好jdk环境之后需要安装Elasticsearch

1
2
3
rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
wget -c https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.noarch.rpm
rpm -ivh elasticsearch-1.7.2.noarch.rpm

修改配置文件如下

1
2
3
4
cd /usr/local/elasticsearch/
vim config/elasticsearch.yml
path.data: /data/db
network.host: 192.168.100.233

安装Elasticsearch插件如下

1
cd /usr/share/elasticsearch/ &&  ./bin/plugin -install mobz/elasticsearch-head && ./bin/plugin -install lukas-vlcek/bigdesk/2.5.0

之后启动Elasticsearch

1
systemctl start elasticsearch

然后开始安装kibana

去https://www.elastic.co/downloads/kibana 找合适的版本每个版本下面有这么一行内容一定要注意这些内容Compatible with Elasticsearch 1.4.4 - 1.7

我这里选择的是kibana-4.1.3-linux-x64.tar.gz

1
2
3
4
5
6
7
8
wget https://download.elastic.co/kibana/kibana/kibana-4.1.3-linux-x64.tar.gz 
tar xf kibana-4.1.3-linux-x64.tar.gz
mv kibana-4.1.3-linux-x64 /usr/local/kibana
cd !$
vim config/kibana.yml 
port: 5601
host: "192.168.100.233"
elasticsearch_url: "http://192.168.100.233:9200"

配置文件中指明kibana侦听5601端口并且通过9200端口从elasticsearch里面获取数据。

再安装nginx可以选择源码安装这里为了图方便就使用yum安装了。

yum -y install nginx

vim /etc/nginx/nginx.conf

将server改成如下

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name _;
         location / {
         proxy_pass http://192.168.100.233:5601;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection 'upgrade';
         proxy_set_header Host $host;
         proxy_cache_bypass $http_upgrade;
            }
}

将日志保存格式修改为如下

1
2
3
4
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
             '$status $upstream_response_time $request_time $body_bytes_sent '
             '"$http_referer" "$http_user_agent" "$http_x_forwarded_for" "$request_body" '
             '$scheme $upstream_addr';

修改日志格式是为了匹配后面的Logstash的grok匹配规则

启动nginx和kibana

1
2
systemctl start nginx
nohup /usr/local/kibana/bin/kibana -l /var/log/kibana.log &

或者也可以看看下面两个脚本

1
2
cd /etc/init.d &&  curl -o kibana https://gist.githubusercontent.com/thisismitch/8b15ac909aed214ad04a/raw/fc5025c3fc499ad8262aff34ba7fde8c87ead7c0/kibana-4.x-init
cd /etc/default &&  curl -o kibana https://gist.githubusercontent.com/thisismitch/8b15ac909aed214ad04a/raw/fc5025c3fc499ad8262aff34ba7fde8c87ead7c0/kibana-4.x-default

关于开机启动Kibana的。

之后就需要安装Logstash了

1
2
3
4
5
6
7
8
9
rpm --import https://packages.elasticsearch.org/GPG-KEY-elasticsearch
vi /etc/yum.repos.d/logstash.repo
[logstash-1.5]
name=Logstash repository for 1.5.x packages
baseurl=http://packages.elasticsearch.org/logstash/1.5/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1
yum -y install logstash

这个包比较大可能国内下载起来比较慢可以去官网使用迅雷下载比较快一点。

创建TLS证书

logstash和logstash-forwarder通信需要使用tls证书认证。Logstash Forwarder上面只需公钥logstash需要配置公钥、私钥。在logstash服务器上生成ssl证书。

创建ssl证书有两种方式一种指定IP地址一种指定fqdn(dns)。

1、指定IP地址方式

vi /etc/pki/tls/openssl.cnf

在[ v3_ca ]下面配置subjectAltName = IP:192.168.100.233切记这条很重要因为还有一个地方也有subjectAltName配置错了的话就会一直无法实现认证

1
2
cd /etc/pki/tls
openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

注意将-days设置大点以免证书过期。

2、使用fqdn方式

不需要修改openssl.cnf文件。

1
2
cd /etc/pki/tls
openssl req -subj '/CN=logstash.abcde.com/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

将logstash.abcde.com换成你自己的域名。同时到域名解析那添加logstash.abcde.com的A记录。

使用那种方式都行不过如果logstash服务端的IP地址变换了证书不可用了。

配置logstash

logstash配置文件是以json格式设置参数的配置文件位于/etc/logstash/conf.d目录下配置包括三个部分输入端过滤器和输出。

首先创建一个01-lumberjack-input.conf文件设置lumberjack输入Logstash-Forwarder使用的协议。

1
2
3
4
5
6
7
8
9
vi /etc/logstash/conf.d/01-lumberjack-input.conf
input {
  lumberjack {
    port => 5043
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

再来创建一个02-nginx.conf用于过滤nginx日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vi /etc/logstash/conf.d/02-nginx.conf 
filter {
  if [type] == "nginx" {
    grok {
      match => { "message" => "%{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:method} %{NOTSPACE:request}(?: %{URIPROTO:proto}/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:status} (?:%{NUMBER:upstime}|-) %{NUMBER:reqtime} (?:%{NUMBER:size}|-) %{QS:referrer} %{QS:agent} %{QS:xforwardedfor} %{QS:reqbody} %{WORD:scheme} (?:%{IPV4:upstream}(:%{POSINT:port})?|-)" }
      add_field => [ "received_at""%{@timestamp}" ]
      add_field => [ "received_from""%{host}" ]
    }
    date {
        match => [ "timestamp" "dd/MMM/YYYY:HH:mm:ss Z" ]
    }
   geoip {
        source => "clientip"
        add_tag => [ "geoip" ]
        fields => ["country_name""country_code2","region_name""city_name""real_region_name""latitude""longitude"]
        remove_field => [ "[geoip][longitude]""[geoip][latitude]" ]
    }
  }
}

这个过滤器会寻找被标记为“nginx”类型Logstash-forwarder定义的的日志尝试使用“grok”来分析传入的nginx日志使之结构化和可查询。

type要与logstash-forwarder相匹配。

同时注意将nginx日志格式设置成上面的。

日志格式不对grok匹配规则要重写。

可以通过http://grokdebug.herokuapp.com/ 在线工具进行调试。多半ELK没数据错误在此处。

grok 匹配日志不成功不要往下看了。搞对为止先。

同时多看看http://grokdebug.herokuapp.com/patterns#   grok匹配模式对后面写规则匹配很受益的。

最后创建一文件来定义输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vi /etc/logstash/conf.d/03-lumberjack-output.conf 
output {
    if "_grokparsefailure" in [tags] {
      file { path => "/var/log/logstash/grokparsefailure-%{type}-%{+YYYY.MM.dd}.log" }
    }
    elasticsearch {
        host => "10.1.19.18"
        protocol => "http"
        index => "logstash-%{type}-%{+YYYY.MM.dd}"
        document_type => "%{type}"
        workers => 5
        template_overwrite => true
    }
    #stdout { codec =>rubydebug }
}

定义结构化的日志存储到elasticsearch对于不匹配grok的日志写入到文件。

注意后面添加的过滤器文件名要位于01-99之间。因为logstash配置文件有顺序的。

在调试时候先不将日志存入到elasticsearch而是标准输出以便排错。

同时多看看日志很多错误在日志里有体现也容易定位错误在哪。

在启动logstash服务之前最好先进行配置文件检测如下

1
2
/opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/*
Configuration OK

也可指定文件名检测直到OK才行。不然logstash服务器起不起来。

最后就是启动logstash服务了。

1
systemctl start logstash

然后就是配置Logstash-forwarder客户端了。

安装logstash-forwarder

1
2
wget https://download.elastic.co/logstash-forwarder/binaries/logstash-forwarder-0.4.0-1.x86_64.rpm
rpm -ivh logstash-forwarder-0.4.0-1.x86_64.rpm

需要将在安装logstash时候创建的ssl证书的公钥拷贝到每台logstash-forwarder服务器上。

1
scp 192.168.100.233:/etc/pki/tls/certs/logstash-forwarder.crt /etc/pki/tls/certs/

配置logstash-forwarder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi /etc/logstash-forwarder.conf
{
  "network": {
    "servers": [ "10.1.19.18:5043" ],
    "ssl ca""/etc/pki/tls/certs/logstash-forwarder.crt",
    "timeout": 30
  },
  "files": [
    {
        "paths": [ "/alidata/logs/nginx/*-access.log" ],
        "fields": { "type""nginx" }
    
  ]
}

这也是个json个是的配置文件。json格式不对logstash-forwarder服务是启动不起来的。

后面就是启动logstash-forwarder服务了。

当上面的所有都配置正确的话就可以访问kibana来查看数据了。

访问效果如下所示

本文出自 “柠檬” 博客,请务必保留此出处http://xianglinhu.blog.51cto.com/5787032/1716274

最新文章

  1. iOS 隐藏键盘的几种常见方法
  2. LINUX端口查看
  3. php中ckeditor(Fckeditor)的配置方法
  4. android文件系统挂载分析(1)---正常开机挂载
  5. 网易新闻RSS阅读器
  6. 为SharePoint网站创建自定义导航菜单
  7. HW3.3
  8. [Leveldb源码剖析疑问]-block_builder.cc之Add函数
  9. 详解Bootstrap 定义按钮的样式(CSS)
  10. mongoDB介绍、安装、搭建简单的mongoDB服务器(一)
  11. Entity Framework 自动生成代码 如何用继承
  12. SAP 维护视图创建与修改
  13. 在C 与 C++混编中, 出现error LNK2019: 无法解析的外部符号 "int __cdecl main_(int,char * *)" (?main_@@YAHHPEAPEAD@Z),该符号在函数 main 中被引用
  14. map内置函数分析所得到的思路
  15. 1.numpy_overview
  16. JavaScript中如何对一个对象进行深度clone
  17. Eclipse Mars 2安装Drools6.4插件(Drools and jBPM tools)时无法安装JBoss Runtime Drools Detector
  18. 【Android】Android解析短信操作
  19. eclipse wtp 没有自动生成 web.xml
  20. opencascade读取iges并用vtk离散的一些问题

热门文章

  1. UNIX环境编程学习笔记(23)——信号处理初步学习
  2. 【VirtualBox】共享文件夹失效问题
  3. VCL 中的 Windows API 函数(1): AbortDoc
  4. QT 实现QGraphicsProxyWidget对象可选择或移动(item管理实现)
  5. position absolute定位之所属的containing box
  6. 【scala】scala 数组 (三)
  7. [GPU] CUDA for Deep Learning, why?
  8. c#中如何退出程序后自动重新启动程序
  9. AES-128-CBC加密
  10. 【AI】Ubuntu NVIDIA CUDA CUDNN安装配置