ELK

ELK 日志分析系统

1. ELK 是什么

ELK 是一个集中式日志收集系统,将所有节点上的日志统一收集、管理、访问。它由三个开源软件组成分别是:Elasticsearch、Logstash、Kibana。

Elasticsearch 是分布式搜索引擎,提供搜索、分析、存储数据。
Logstash 用来日志搜集、分析、过滤日志。
Kibana 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

2. 环境准备

节点 IP 节点规划 主机名
192.168.187.129 ES + KB elk-1
192.168.187.135 ES + LS elk-2
192.168.187.133 ES elk-3

① 配置 hosts 文件

# vim /etc/hosts   //三个都配
[配置内容入下]
192.168.187.129 ELK-1
192.168.187.135 ELK-2
192.168.187.133 ELK-3
[精致的结尾]

② 安装 JDK, 部署ELK环境需要jdk1.8以上的JDK版本软件环境,我们使用opnejdk1.8

# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel // 三个都按
# java -version //有内容输出

3. 安装 Elasticserach 以及配置

# cd /root/  //三个都按装
# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm   
# rpm -ivh elasticsearch-6.0.0.rpm // -i 安装 -v 可视化 -h 显示进度
# vi /etc/elasticsearch/elasticsearch.yml 
[配置内容如下]
【¥】cluster.name: ELK  
//配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
# ------------------------Node -----------------
# Use a descriptive name for the node:
【¥】node.name: elk-1	
//节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。
【¥】node.master: true	
//指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。 其他两节点为false
【¥】node.data: false	
//指定该节点是否存储索引数据,默认为true。其他两节点为true
# ----------------- Paths ----------------
# Path to directory where to store the data (separate multiple locations by comma):
path.data: /var/lib/elasticsearch 
//索引数据存储位置(保持默认,不要开启注释)
# Path to log files:
path.logs: /var/log/elasticsearch 
//设置日志文件的存储路径,默认是es根目录下的logs文件夹
# --------------- Network ------------------
# Set the bind address to a specific IP (IPv4 or IPv6):
【¥】network.host: 192.168.187.129  
//设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0。
# Set a custom port for HTTP:
http.port: 9200  
//启动的es对外访问的http端口,默认9200
# For more information, consult the network module documentation.
# --------------------Discovery ----------------
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]
【¥】discovery.zen.ping.unicast.hosts: ["elk-1","elk-2","elk-3"] 
//设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。
[精致的结尾]

4. 启动服务以及检查集群状态

# systemctl start elasticsearch
# ps -ef |grep elasticsearch  // 一大坨
# netstat -lntp // 查看又没有 9200 9300 端口
[错误] 启动后先是 ps 有“一大坨”,然后再 ps 又没有了
① 查看日志
# cat /var/log/elasticsearch/elk.log 
② 发现Caused by: java.lang.IllegalArgumentException: unknown setting [discovery.zenthe breaking changes documentation for removed settings
③ 定位到 discovery 字段,和文档对比发现最后一行没有加s
[错误解决]
# curl'192.168.187.129:9200/_cluster/health?pretty'
{
  "cluster_name" : "ELK",
  "status" : "green",	
//为green则代表健康没问题,yellow或者red	则是集群有问题
  "timed_out" : false,	
//是否有超时
  "number_of_nodes" : 3, 
//集群中的节点数量
  "number_of_data_nodes" : 2,	
//集群中data节点的数量
  "active_primary_shards" : 1,
  "active_shards" : 2,
 ...
 }

5. 安装并配置 Kibana

# cd /opt
# wget https://mirrors.tuna.tsinghua.edu.cn/elasticstack/6.x/yum/6.0.0/kibana-6.0.0-x86_64.rpm
# vi /etc/kibana/kibana.yml  
[配置内容如下]
server.port: 5601
server.host: 192.168.4011
elasticsearch.url: "http://192.168.40.11:9200"
[精致的结尾]
# systemctl start kibana
# ps -ef | grep kibana
# netstat -lntp | grep node //有 5601

6. 安装并配置 Logstash

# cd /opt 
# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.rpm
# vim /etc/logstash/logstash.yml
[修改内容如下]
http.host: "192.168.187.135"
[精致的结尾]

7. 配置 logstash 收集 syslog 日志

# vim /etc/rsyslog.conf   // 与 logstash 服务器建立连接
[配置内容如下]
*.* @@192.168.187.135:10514 // logstash 服务器所在的 IP
[精致的结尾]
# vim /etc/logstash/conf.d/syslog.conf  // 配置收集日志
[配置内容如下]
input {   //定义日志源
  syslog {    // syslog 插件
    type => "system-syslog"  //定义日志类型
    port => 10514  // 监听 10514 端口
    start_position => "beginning"  // 从日志文件的最开始的地方获取,没有这个配置项,从日志文件的末尾获取
    stat_interval => "3"  // 检测文件是否被修改的时间间隔【以秒为单位】,增加该时间将减少系统的调用量,但是会延迟日志更新的时间。
  }
}
output {   // 输出到什么地方
  elasticsearch {
    hosts => ["192.168.187.135:9200"]  // 输出到 135 的 es 服务器上
    index => "system-syslog-%{+YYYY.MM}"  // 输出的文件名格式 
  }
}
[精致的结尾]
# logstash --paht.settings /etc/logstash -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit  // 检测 syslog.conf 的配置是否有问题,出现 OK 为没有问题。
【参数解释】
 --path.settings : 用于指定logstash的配置文件所在的目录
 -f : 指定需要被检测的配置文件的路径
 --config.test_and_exit : 指定检测完之后就退出,不然就会直接启动了
# systemctl start logstash  // 启动 logstash 服务
# ps -ef | grep logstash  // 查看进程,一大坨
# netstat -lntp // 有 9600 端口
# netstat -lnp | grep 1054 // 有内容输出
# chown -R logstash /var/lib/logstash/
# systemctl restart logstash
# curl '192.168.187.129:9200/_cat/indices?v'  // 有 system-syslog- 输出
# curl -XGET/DELETE '192.168.187.129:9200/**?pretty'  //**为上一步 system-syslog 开头的内容,该命令的作用是获取或删除指定索引的详细信息

浏览器访问 192.168.187.129:5601 到 Kibana 配置索引,左侧点击“Managerment”-> “Index Patterns”-> “Create Index Pattern”
Index pattern这里写 system-syslog-*
之后点击左侧的Discover

8. logstash 收集 Nginx 日志

1. nginx 配置文件的配置

vim /etc/nginx/conf.d/elk.conf
[配置内容如下]
server {
	listen 80;
	server_name elk.com;
	location / {
		proxy_pass http://192.168.187.129:5601;  // IP 为安装了 kibana 的 IP
		proxy_set_header Host $host;  // 以下均为允许转发的头部信息
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
	}
	access_log /tmp/elk_access.log main2;  //访问日志的位置,以及格式
}
# vim /etc/nginx/nginx.conf  // 添加访问日志的格式
[配置内容如下]
log_format main2 '$http_host $remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$upstream_addr" $request_time';
[精致的结尾]
# nginx -t && systemctl start nginx //检查配置并启动 nginx

2. logstash 的配置文件

# vim /etc/logstash/conf.d/nginx.conf
[配置内容如下]
input {
  file {
    path => "/tmp/elk_access.log"   // nginx访问日志的路径
    start_position => "beginning"
    type => "nginx"
  }
}
filter {
    grok {
        match => { "message" => "%{IPORHOST:http_host} %{IPORHOST:clientip} - %{USERNAME:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:http_verb} %{NOTSPACE:http_request}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" %{NUMBER:response} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{QS:xforwardedfor} %{NUMBER:request_time:float}"}
    }
    geoip {
        source => "clientip"
    }
}
output {
    stdout { codec => rubydebug }  // 设置输出格式 josn
    elasticsearch {
        hosts => ["192.168.187.135:9200"]
	index => "nginx-test-%{+YYYY.MM.dd}"
  }
}
[精致的结尾]
#logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/nginx.conf --config.test_and_exit

9. 使用 beat 采集日志

#wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.0.0-x86_64.rpm
# rpm -ivh filebeat 
# vim /etc/filebeat/filebeat.yml
[配置内容如下]
filebeat.prospectors:
  paths:
    - /var/log/elasticsearch/elk.log	//此处可自行改为想要监听的日志文件
# enable false
output.elasticsearch:
  hosts: ["192.168.40.11:9200"]
[精致的结尾]
# systemctl start  filebeat
# curl '192.168.40.11:9200/_cat/indices?v' //出现 filebeat 成功!
上一篇:如何在Ubuntu 20.04 LTS Focal Fossa上安装Webmin


下一篇:How to install Gnome on Ubuntu 20.04 LTS Focal Fossa