快速搭建全套ELK日志分析系统

ELK:Elasticsearch 搜索引擎、Logstash 日志收集、Kibana 视图展现
Elasticsearch 搜索引擎
1.mac安装方式
安装:

brew  install elasticsearch

启动:

brew  services start elasticsearch

停止:

brew  services stop elasticsearch

前台启动:

elasticsearch

2.官方下载包方式
启动:cd 进入elasticsearch文件夹bin目录 sh elasticsearch
安装head插件
github地址:https://github.com/mobz/elasticsearch-head
下载插件并进入目录执行npm install和npm install grunt --save命令

cd /Volumes/tool/elasticsearch-head-master 
npm install
npm install grunt --save
启动 npm run start

启动成功
接下来让Elasticsearch连接上head,首先进入到本地安装到Elasticsearch文件夹中,然后进入config文件夹中修改elasticsearch.yml,在配置文件最下方加上cors配置:


   http.cors.enabled: true
   http.cors.allow-origin: "*"

保存退出并启动Elasticsearch和head插件,就可以看到elasticsearch已经连接上了head插件。
Elasticsearch主从集群
修改elasticsearch.yml加入配置


主机配置:
 http.cors.enabled: true
 http.cors.allow-origin: "*"
 #集群名称
 cluster.name: ritian
 #节点名称
 node.name: master
 #指定为主机 
 node.master: true
 #主机IP,默认端口为9200
  network.host: 127.0.0.1
从机配置:
 #集群,这个需要保证和master一致
 cluster.name: ritian
 #节点名称
 node.name: slave1 
 #绑定IP
 network.host: 127.0.0.1
 #本机端口
 http.port: 9300
#找到master节点,默认端口为9200
 discovery.zen.ping.unicast.hosts: ["127.0.0.1"]</font>

注意:复制文件的时候需要无data文件夹,如果出现head中检测不到集群的情况,可以删除data文件夹。
Logstash日志收集解析
官方下载包方式
启动Logstash 进入logstash/bin目录启动logstash.sh 创建logstash.conf
Logstash传输日志到Elasticsearch读取解析 手输日志打印

input{
  stdin{}    #标准写入
}
output{
   stdout{
    codec=>rubydebug   #标准输出
   }
}
读取日志发送到elasticsearch
input {
    file {
        path => "/usr/local/Cellar/nginx/1.17.3_1/logs/*.log"   # 读取日志地址
        start_position => beginning
    }
}
output {
    elasticsearch {
    hosts => "localhost:9200"    #ES端口
    }
}

启动:

sh logstash -f logstash.conf
在kibana中通过 GET http://localhost:9200/_cat/indices?v 查看日志文件,点击 Management选择kibana下的index patterns创建一个索引来查看日志 我们要查看logstash的日志信息,通过输入logstash-*选择查询所有日志, 然后点击next step,选择过滤模式并创建索引模式,点击Discover并选择刚创建的索引查看所有日志信息。 input 配置参考: https://www.elastic.co/guide/en/logstash/current/input-plugins.html output 配置参考: https://www.elastic.co/guide/en/logstash/current/output-plugins.html filter 配置参考: https://www.elastic.co/guide/en/logstash/6.4/filter-plugins.html Logstash Reference:https://www.elastic.co/guide/en/logstash/6.4/index.html

Logstash收集日志必要点:
1.日志文件需要有新日志产生
2.Logstash跟Elasticsearch要能通讯

Logstash去除不需要的字段
去除字段:
1.只能去除_source里的,非_source里的去除不了
2.减少ES数据库大小
3.提升搜索效率
Logstash配置去除不需要的字段

filter{
    grok{
       remove_field=>["message","@version","path"]
   }
}

[]中填写_source中的字段

Logstash Json格式日志的采集
Json的好处
1.原生日志需要做正则匹配,比较麻烦
2.Json格式的日志不需要正则能直接分段采集

Nginx使用Json格式日志
修改nginx.conf

    log_format  json '{"remote_ip":"$remote_addr",'
                 '"time_local":"$time_local",'
                 '"body_sent":$body_bytes_sent,'
                 '"responsetime":$request_time,'
                 '"upstreamtime":"$upstream_response_time",'
                 '"upstreamhost":"$upstream_addr",'
                 '"http_host":"$host",'
                 '"method":"$request_method",'                     
                 '"url":"$request_uri",'
                 '"request":"$request",'
                 '"xff":"$http_x_forwarded_for",'
                 '"referer":"$http_referer",'
                 '"agent":"$http_user_agent",'
                 '"response_code":"$status"}';

隐藏原有配置加入新配置
快速搭建全套ELK日志分析系统_第1张图片
Logstash解析Json日志

 filter{
      json{
        source => "message"   #会将 message中方的数据解析为Json格式
        }
    }

Logstash 时间轴自定义

默认ELK时间轴:
1.以发送日志的时间为准
2.而Nginx本身记录着用户的访问时间
3.分析Nginx上的日志以用户的访问时间为准,而不以发送的时间为准


Logstash的filter里面加入配置用Nginx用户访问时间覆盖发送日志时间
time是正则解析对应的名称 01/Nov/2019:09:27:00 +0800

filter{
  date{
     match => ["time","dd/MMM/yyyy:HH:mm:ss Z"]
     target => "@timetamp"
     }
}
统计Nginx的请求和网页显示进行对比 可以看到每分钟的请求量
cat /usr/local/Cellar/nginx/1.17.3_1/logs/access.log |awk '{print $4}'|cut -b 1-19|sort|uniq -c

不同的时间格式,覆盖的时候格式要对应

  1.20/Feb/2019:14:50:06 -> dd/MMM/yyyy:HH:mm:ss
  2.2016-08-24 18:05:39,830 -> yyyy-MM-dd HH:mm:ss,SSS

Logstash正则提取Nginx日志

Nginx日志说明
日志记录:127.0.0.1 - root [01/Nov/2019:09:27:00 +0800] “GET /ui/fonts/inter_ui/Inter-UI-Bold.woff2 HTTP/1.1” 304 0 “http://localhost:8888/app/kibana” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36” “-”
1.访问地址IP
2.访问时间
3.请求方式(GET/POST)
4.请求URL
5.状态码
6.响应body大小
7.Referer
8.User Agent

Logstash正则提取日志
1.需要懂得正则,logstash支持普通正则和扩展正则
2.需要了解Grok,利用kibana的Grok学习logstash正则提取过程:
点击Dev Tools,选择Grok Debugger,将日志复制进Sample data中 ,Grok Patern中放入正则表达式。

Grok提取Nginx日志
1.Grok使用(?提取内容)来提取xxx字段
2.提取客户端IP: (?[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}) 定义字段名为IP
3.提取时间: [(?[^ ]+ +[0-9]+)\ ]
4.提取日志需要正则完整的提取所有内容,提取任何日志都可用此方法。

Logstash正则提取Nginx日志
1.在logstash.conf中加入一段filter代码
2.加入_grokparsefailure" not in [tags]and “_dateparsefailure” not in [tags]判断可以防止正则将错误输出到ES

output{
   if "_grokparsefailure" not in [tags]and "_dateparsefailure" not in [tags]{
    elasticsearch{
       hosts=>["http://localhost:9200"] 
     }
  }
}
filter{
  grok{
    match = >{
       "message" => '正则表达式'
      }
   }
}

Kibana 数据展现
1.mac安装方式
安装:

   brew  install  kibana	

启动:

   brew  services start kibana	

关闭:

brew  services stop  kibana	

前台启动:

  kibana	
2.官网下载包即可 启动Kibana 进入kibana/bin目录sh kibana 启动,kibana.yml中的配置elasticserch地址配置为elasticsearch.host:['localhost:9200'],server:host设置为0.0.0.0供外网访问

Kibana借用Nginx实现认证

默认的kibana
1.任何人都能无密码访问kibana
2.借用Nginx实现认证
3.Nginx控制源IP访问、Nginx可以使用用户密码的方式
4.把kibana监听在127.0.0.1,然后用Nginx转发

Nginx两种限制
注:sodu nginx 查看日志 mac使用nginx需要自己创建log文件夹以及access.log日志文件
1.限制源IP访问,比较安全

  修改nginx.conf  配置 
   location /{
        allow 127.0.0.1;   # allow 允许访问的IP
        deny  all;   # deny 拒绝访问
        proxy_pass  http://127.0.0.1:5601/;  #proxy_pass 地址转发
    }
  修改kibana.yml server.host 将IP绑定至127.0.0.1

2.借用nginx的用户名密码机制,配置nginx用户名密码进行登录
修改nginx.conf

     location /{
           auth_basic "elk 账号密码认证";
           auth_basic_user_file /Volumes/tool/nginx_auth; # auth_basic_user_file 账号密码文件
           proxy_pass  http://127.0.0.1:5601/;  # proxy_pass 地址转发
     }

添加账号密码 htpasswd -cb /Volumes/tool/nginx_auth root root 一定要以这样的形式添加 否则无效

Kibana图形展示
首页区域
1.可设置查看的时间和设置自动刷新时间
2.可以根据时间查看访问量: 每秒、每分钟等
3.可以根据某个字段查询
Kibana图形有建立
1.线图的创建,可以保留多个线程
2.饼图的创建,show label
3.条形图的创建
Kibana面板的创建
1.创建面板
2.在面板上添加图形

定时刷新
快速搭建全套ELK日志分析系统_第2张图片
创建图形
在这里插入图片描述
选择图形样板
快速搭建全套ELK日志分析系统_第3张图片
选择索引
快速搭建全套ELK日志分析系统_第4张图片
Filebeat日志收集解析

Logstash收集日志
1.依赖于java环境,用来收集日志比较重,占用内存和CPU
2.Filebeat相对轻量,占用服务器资源小
3.一般选用Filebeat来进行日志收集
Filebeat -> Elasticsearch ->Kinaba
1.只适合查看日志
2.不适合具体日志分析
3.不支持正则,不支持去除字段

Filebeat安装:官网直接下载包即可

Filebeat发送日志到Elasticsearch
修改filebeat.yml

filebeat.inputs:
- type: log  
  tail_file: true  
  backoff: "1s"  
  paths:
      - /usr/local/Cellar/nginx/1.17.3_1/logs/*.log   

output:
 elasticsearch:
  hosts: ["localhost:9200"]


启动Filebeat -c指定配置文件
cd 进入filebeat安装目录执行命令启动

 filebeat -e -c filebeat.yml 


Filebeat查看日志数据方式
GET /filebeat-7.4.1-2019.11.01-000001/_search 创建filebeat-*索引

Filebeat采集多个日志

修改Filebeat.yml配置

filebeat.inputs:
- type: log  
  tail_file: true  
  backoff: "1s"  
  paths:
     - /usr/local/Cellar/nginx/1.17.3_1/logs/*.log   
  fields:
   type: nginx    #日志区分标识符
  fields_under_root: true
- type: log       #加一个type收集日志
  tail_file: true  
  backoff: "1s"  
  paths:
     - /Volumes/tool/apache-tomcat-8.5.40/logs/*.log   
  fields:
   type: tomcat    #日志区分标识符
  fields_under_root: true

output:
 logstash:
  hosts: ["localhost:5044"]

Logstash如何区分日志并对日志进行不同的解析
1.Filebeat加入一定字段来进行区分
2.Logstash使用区别字段来区分

修改filebeat-logstash.conf配置文件,通过type字段进行判断区分多个日志

input {
 beats{
  port => 5044
 }   
}
filter{
  if[type]=="nginx"{
    json{         
      source=>"message" #因为nginx是json格式
     }
    }else if[type]=="tomcat"{
     }
}

output {
  if[type]=="nginx"{   #也可以通过type判断将日志传输到不同的服务器上的Elasticsearch中
    elasticsearch {
    hosts => "localhost:9200"    
    index => "nginx-%{+YYYY.MM.dd}"
    }
  }else if[type]=="tomcat"{
    elasticsearch{
    hosts => "localhost:9200"
    index => "tomcat-%{+YYYY.MM.dd}"   
    }
  }
}

Filebeat+Logstash日志收集解析

Filebeat和Logstash说明
1.Filebeat: 轻量级,但不支持正则,不支持去除字段,不需要依赖java环境
2.Logstash: 比较重,但支持正则,支持移除字段,需要依赖java环境

搭建架构演示
1.Logstash -> Elasticsearch -> Kinaba
2.Filebeat -> Elasticsearch -> Kinaba
3.Filebeat - > Logstash -> Elasticsearch -> Kinaba

修改Filebeat配置发往Logstash

filebeat.inputs:
- type: log  
  tail_file: true  
  backoff: "1s"  
  paths:
      - /usr/local/Cellar/nginx/1.17.3_1/logs/*.log   

output:
  logstash:
   hosts: ["localhost:5044"]

新建一个filebeat-logstash.conf

input {
 beats{
  host =>'0.0.0.0'  #访问IP限制
  port => 5044   #监听端口
 }   
}
output {
    elasticsearch {
    hosts => "localhost:9200"    
    }
}

Logstash上移除不必要的字段

remove_field => ["message","@version"]

Filebeat批量部署比Logstash要方便得多
1.Logstash监听在内网
2.Filebeat发送给内网的Logstash


架构如下

Filebeat(多台)
Filebeat(多台) -> Logstash(正则) -> Elasticsearch(入库) -> Kibana(展现)
Filebeat(多台)

Filebeat和Logstash间引入Redis

架构存在问题
1.Logstash性能不足
2.扩容Logstash,多台Filebeat配置可能会不一致

架构优化
Filebeat(多台)                                Logstash(正则)
Filebeat(多台) -> Redis , Kafka -> Logstash(正则) -> Elasticsearch -> Kibana
Filebeat(多台)                                Logstash(正则)
Redis安装搭建
省略。。。。。。

Filebeat配置写入Redis
修改Filebeat.yml

filebeat.inputs:
- type: log  
  tail_file: true  
  backoff: "1s"  
  paths:
     - /usr/local/Cellar/nginx/1.17.3_1/logs/*.log   
  fields:
   type: nginx    #日志区分标识符
  fields_under_root: true

output.redis:
  hosts: ["127.0.0.1:6379"]
  db: 2   #存储的库
  timeout: 5  #连接超时
  key: "logs"   #存储数据的key Redis会自动创建

Logstash从Redis中读取数据
input{
   redis{
     host => "127.0.0.1"
     port => "6379"
     key  => "logs"   #读取的key
     data_type => "list"  #读取类型
     db => 2    #读取的库
     batch_count => 1     #这个值是指从队列中读取数据时,一次性取出多少条。不写会报错,解决办法就是,不使用这个功能,将       batch_size设置为1

   }
}
output {
  if[type]=="nginx"{   
    elasticsearch {
    hosts => "localhost:9200"    
    index => "nginx-%{+YYYY.MM.dd}"
    }
  }else if[type]=="tomcat"{
    elasticsearch{
    hosts => "localhost:9200"
    index => "tomcat-%{+YYYY.MM.dd}"   
    }
  }
}

启动redis会发现数据库中自动创建了key “logs”
快速搭建全套ELK日志分析系统_第5张图片
启动Filebeat后,需要nginx添加日志,Filebeat才会开始进行连接Redis并插入数据

Filebeat和Logstash间引入Kfaka

Kafka依赖于Zookeeper
1.Kafka安装:官网下载二进制安装包
2.Zookeeper安装:官网下载二进制安装包 下载bin的包

Zookeeper启动
1.进入config目录:cp zoo_sample.cfg zoo.cfg
2.更改配置添加:clientPortAddress=127.0.0.1 监听IP
2.启动: zkServer.sh start
注意点:默认使用8080端口

Kafaka启动
进入bin目录,启动:kafka-server-start.sh …/config/server.properties

Filebeat日志发送到Kafka

filebeat.inputs:
- type: log  
  tail_file: true  
  backoff: "1s"  
  paths:
     - /usr/local/Cellar/nginx/1.17.3_1/logs/*.log   
  fields:
   type: nginx    #日志区分标识符
  fields_under_root: true

output:
  kafka: 
   hosts: ["127.0.0.1:9092"]
   topic: logs


Logstash读取Kafka的数据

input{
   kafka{
      bootstrap_servers => "127.0.0.1:9092"
      topics => ["logs"]   #数组类型,可配置多个topic
      group_id => "logs"   #组Id可自定义
      consumer_threads => 5   #消费者线程数
      decorate_events => true      //此属性会将当前topic、offset、group、partition等信息也带到message中   
      codec => "json"  
   }
}
output {
  if[type]=="nginx"{   
    elasticsearch {
    hosts => "localhost:9200"    
    index => "nginx-%{+YYYY.MM.dd}"
    }
  }else if[type]=="tomcat"{
    elasticsearch{
    hosts => "localhost:9200"
    index => "tomcat-%{+YYYY.MM.dd}"   
    }
  }
}


Kafka查看队列信息

1.查看Group: kafka-consumer-groups.sh -bootstrap-server 127.0.0.1:9092 --list
2.查看队列: kafka-consumer-groups.sh -bootstrap-server 127.0.0.1:9092 -group logs --describe

你可能感兴趣的:(Logstash,Elasticsearch,Kibana)