菜鸟笔记
提升您的技术认知

ELK 日志分析系统部署

ELK 日志分析系统

组件简介
0、beats :日志收集客户端
1、logstash:日志收集服务端
2、Elasticsearch :日志搜索引擎持久化
3、Kinaba :数据分析工具
Beats可以直接(或者通过Logstash)将数据发送到Elasticsearch,在那里你可以进一步处理和增强数据,然后在kibana中将其可视化。

Beats是个工具集,它包含了filebeat,winlogbeat、metricbeat等等数据收集子工具,一般我们使用的日志文件收集工具,因此filebeat用的最多也是最普遍的使用方式。

Logstash是一个开源的服务器端数据处理管道,可以同时从多个数据源获取数据,并对其进行转换,然后将其发送到你最喜欢的“存储”。(当然,我们最喜欢的是Elasticsearch)
Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便更轻松、更快速地分析和实现商业价值。

  • Logstash 能够动态地转换和解析数据,不受格式或复杂度的影响:
  • 利用 Grok 从非结构化数据中派生出结构
  • 从 IP 地址破译出地理坐标
  • 将 PII 数据匿名化,完全排除敏感字段
  • 整体处理不受数据源、格式或架构的影响

    以上是数据处理各种类型的常见方式

数据的持久化,因为这里我们重点是搜索引擎的作为持久化数据。我们也可以把数据放入缓存中持久化,在大数据中也可以作为Hadoop的数据源作为大数据持久化,流式数据处理中也可以作为jstom数据的流式数据源。

组件部署

内容整理进行中…

Elasticsearch

参考我前面的篇章:ELK第一篇:Elasticsearch安装
https://www.coonote.com/note/elasticsearch-install.html

elasticsearch-7.3.0\bin中,双击启动执行 elasticsearch.bat
centos启动

bin/elasticsearch &

用浏览器访问:http://192.168.199.179:9200/

Kinaba

1 kibana下载 https://www.elastic.co/cn/downloads/
2 解压文件
3 需改配置文件:config\kibana.yml
配置文件里面有很多重要的默认配置信息,去掉前面的#注释即可:

server.port: 5601
server.host: "localhost"
elasticsearch.hosts: ["http://localhost:9200"]
kibana.index: ".kibana"
logging.dest: D:\mnt\kibana.log 

还有ES的账号密码。
这些配置根据需要进行修改,例如:ES和kibana不在一个主机,那就需要改ip。
这里软件都在同一个主机,kibana的配置保持不变即可。
4 启动: bin\kibana.bat(windos启动)
6 浏览:http://localhost:5601/

filebeat

windows直接下载解压,修改 filebeat.yml

paths:
    #- /var/log/*.log
    - D:\mnt\min-tool\nginx-1.16.0\logs\access.log
  tags: ["log1"]
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]

启动filebeat

 .\filebeat -e -c filebeat.yml

如果你有nginx的话就使用nginx,同时配置nginx.config的日志格式如下

log_format  main  '$remote_addr - $remote_user [$time_local] $http_host $request_method "$uri" "$query_string" '
                  '$status $body_bytes_sent "$http_referer" $upstream_status $upstream_addr $request_time $upstream_response_time '
                  '"$http_user_agent" "$http_x_forwarded_for"' ;
    access_log  logs/access.log  main;

以上配置的日志格式输出数据如下

192.168.0.200 - - [12/Aug/2019:23:08:18 +0800] 192.168.0.200 GET "/index.html" "name=bamboo" 304 0 "-" - - 0.000 - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" "-"
192.168.0.200 - - [12/Aug/2019:23:10:43 +0800] 192.168.0.200 GET "/index.html" "name=bamboo" 304 0 "-" - - 0.000 - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" "-"

如果你没有的话直接贴如上面的数据到acces.log中即可,没贴一行保存,beats就会触发一次发送日志到logstash中。

Logstash

windows直接下载解压,使用命令启动如下

#输出数据到控制台,调试时使用
logstash -e "input { stdin { } } output { stdout { codec => rubydebug } }"
#输出数据到elasticsearch 并配置号ip
logstash -e "input { stdin { } } output { elasticsearch { hosts => localhost } }"

控制台模式输入数据控制台打印信息

{                                               
      "@version" => "1",                        
    "@timestamp" => 2019-08-11T16:47:41.155Z,   
          "host" => "DESKTOP-VLO4B8K",          
       "message" => "hello\r"                   
}                                               

message是我们输入的内容,其他信息是logstash自带的信息。后面的日志解析也是围绕这message展开,和Hadoop处理行数据原理有些相似。

调试模式,启动后访问端口可以看到配置信息
http://localhost:9600/

使用配置文件启动
这里创建一个文件 logstash.conf

cd config
cp  logstash-sample.conf  logstash.conf

配置文件 ,这里先用控制台输入方式输入日志信息,便于调试,成功后再打开beats

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
stdin { } 
# beats {
#   port => 5044
# }


}


filter {  # 配置过滤器
    grok {
        match => { 
         "message" =>"%{IPORHOST:remote_addr} - - \[%{HTTPDATE:log_timestamp}\] %{HOSTNAME:http_host} %{WORD:request_method} \"%{URIPATH1:uri}\" \"%{URIPARM1:param}\" %{BASE10NUM:http_status} %{BASE10NUM:body_bytes_sent} \"(?:%{URI1:http_referrer}|-)\" (%{BASE10NUM:upstream_status}|-) (?:%{HOSTPORT:upstream_addr}|-) (%{BASE16FLOAT:upstream_response_time}|-) (%{BASE16FLOAT:request_time}|-) (?:%{QUOTEDSTRING:user_agent}|-) \"(%{WORD:x_forword_for}|-)\""
        }
    }

    mutate { # beats传递过来的一些附加数据并不是我们想要的,同时把message数据也去掉,只保留我们想要的数据即可
                remove_field => ["message","host","log","agent","ecs","input","tags"]
    }

    date {  
        match => [ "log_timestamp", "yyyy-MMM-dd-HH:mm:ss Z" ]
        locale => "cn"
    } 
}

output {

 stdout {
    codec => rubydebug  # 将日志输出到当前的终端上显示
  }

  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "nginx-%{[@metadata][version]}-%{+YYYY.MM.dd}" #日志索引按日期生成格式nginx-7.3.0-2019.08.12
    }

}

检查配置并启动Logstash

bin/logstash -f logstash.conf --config.test_and_exit

(画外音:–config.test_and_exit选项的意思是解析配置文件并报告任何错误)

bin/logstash -f logstash.conf --config.reload.automatic

(画外音:–config.reload.automatic选项的意思是启用自动配置加载,以至于每次你修改完配置文件以后无需停止然后重启Logstash)

测试数据

192.168.0.200 - - [12/Aug/2019:23:10:43 +0800] 192.168.0.200 GET "/index.html" "name=bamboo" 304 0 "-" - - 0.000 - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" "-"

控制台打印如下数据则说明正确

{                                                                                                  
                "@timestamp" => 2019-08-12T15:10:48.166Z,                                          
                  "@version" => "1",                                                               
           "body_bytes_sent" => "0",                                                               
    "upstream_response_time" => "0.000",                                                           
            "request_method" => "GET",                                                             
                 "http_host" => "192.168.0.200",                                                   
               "http_status" => "304",                                                             
             "log_timestamp" => "12/Aug/2019:23:10:43 +0800",                                      
                "user_agent" => "\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KH
TML, like Gecko) Chrome/76.0.3809.100 Safari/537.36\"",                                            
               "remote_addr" => "192.168.0.200",                                                   
                      "tags" => [                                                                  
        [0] "_dateparsefailure"                                                                    
    ],                                                                                             
                       "uri" => "/index.html",                                                     
                     "param" => "name=bamboo"                                                      
}                                                                                                                                                                                                                                                                                                                   

这里面去掉了beats中附加的一些数据,只保留我们需要的日志信息就可以了。

如果控制台打印的数据符合我们的要求,则把logstash配置文件输入部分beats、输出到ES的部分注释去掉,如果你启动了nginx的话刷新首页即可看到acces.log日志增加一行同时,logstash的控制台也会输出数据,最后logstash把日志信息发送到ES中。

同时打开es-head插件页面可以看到索引已经生成。

可以查看到索引nginx-7.3.0-2019.08.12的数据如下,说明已经基本搭建成功了

常用的组合结构

elk只是基本结构,当随着数据量和服务集群的增多,那么高并发和大数据量的情况就需要对结构进行优化,如下图是斗鱼ELK日志分析平台实践的模式,使用kafka中间件作为数据缓冲,最终把数据分流到不同的数据处理组件服务上(除了logstash,还用到了hangout,custom自定义处理器),从而达到数据分流削峰队列化减少对处理组件下游的数据并发量的方式达到服务稳定。