对于日志来说,最常见的需求就是收集、存储、查询、展示,开源社区正好有相对应的开源项目:logstash(收集)、elasticsearch(存储+搜索)、kibana(展示),我们将这三个组合起来的技术称之为ELKStack,所以说ELKStack指的是Elasticsearch、Logstash、Kibana技术栈的结合

一、环境介绍

1、操作系统

CentOS Linux release 7.6.1810 (Core)

2、软件版本

  • elasticsearch-2.3.5
  • kibana-4.5.4-1.x86_64
  • logstash-2.3.4-1.noarch

3、主机分配

服务 IP地址 主机名
elasticsearch 10.201.1.145 k8s-m1
elasticsearch 10.201.1.146 k8s-n1
logstash 10.201.1.145 k8s-n1
kibana 10.201.1.146 k8s-n1

二、安装部署

1、在145/146两台服务器安装elasticsearch

  • 安装Java
yum install -y java
  • 安装RPM软件包
rpm -ivh elasticsearch-2.3.5.rpm
sudo systemctl daemon-reload
systemctl enable elasticsearch.service
rpm -ql elasticsearch
  • 先修改145配置文件(取消注释做如下修改)
grep '^[a-z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: myes #节点名称,所有节点要保持一致
node.name: k8s-m1 #节点名称,一般设置为主机名,不能和其他节点重复
path.data: /data/es-data  #数据存放路径
path.logs: /var/log/elasticsearch #log存放路径
bootstrap.mlockall: true #保证内存不被放到交换分区里面
network.host: 10.201.1.145 #当前主机IP
http.port: 9200 #服务端口
  • 再来修改146配置文件
grep '^[a-z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: myes
node.name: k8s-n1
path.data: /data/es-data
path.logs: /var/log/elasticsearch
bootstrap.mlockall: true #保证内存不被放到交换分区里面
network.host: 10.201.1.146
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.201.1.145", "10.201.1.146"] #单播的方式发布自己的服务,让其他es节点识别
  • 创建配置文件中所需目录,并赋予权限
mkdir -p  /data/es-data
chown -R elasticsearch:elasticsearch /data/es-data
  • 启动服务
/etc/init.d/elasticsearch start
tail -f /var/log/elasticsearch/myes.log
netstat -lntpu|grep 9200
  • 在145主机上安装常用插件,插件需要查看是否适用当前版本

安装head插件

/usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head

浏览器访问插件,查看状态

http://10.201.1.145:9200/_plugin/head/

如下图示,表明安装正常

ELK搭建,使用。_第1张图片

安装kopf插件

/usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf

浏览器访问插件,查看状态

http://10.201.1.145:9200/_plugin/kopf/

如下图示,表明安装正常

ELK搭建,使用。_第2张图片
ELK搭建,使用。_第3张图片

  • 至此,两台elasticsearch 已经搭建完成

2、145安装logstash

  • logstash的运行需要依赖Java环境,前面已经安装过

  • RPM安装软件包
rpm -ivh logstash-2.3.4-1.noarch.rpm
rpm -ql  logstash
  • 验证使用logstash的一些插件(具体参考官方文档)

命令行模式下验证:

/opt/logstash/bin/logstash -e 'input { stdin{} } output { stdout{} }'  #标准的输入和输出
/opt/logstash/bin/logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug} }' 
/opt/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["10.201.1.145"] index => "logstash-%{+YYYY.MM.dd}"} }'  #将输入输出到es中,并创建索引

写入配置文件形式验证(默认读取的目录为/etc/logstash/conf.d/):

cat file.conf
input{
    file{
       path => ["/var/log/messages", "/var/log/secure"]
       type => "system-log"
       start_position => "beginning"
}
}
filter{
}
output{
    elasticsearch {
            hosts => ["10.201.1.145:9200"]
            index => "system-log-%{+YYYY.MM}"
        }  
}
  • 下面列举常用的收集日志方法
  1. 收集系统日志,和java日志
cat /etc/logstash/conf.d/file.conf
input{
    file{ #file 是收集本地文件
       path => ["/var/log/messages", "/var/log/secure"] #收集的路径
       type => "system-log"                             #索引和指定的类型,为下面做判断
       start_position => "beginning"                    #从头开始收集
}
    file{
       path => "/var/log/elasticsearch/myes.log"
       type => "es-log"
       start_position => "beginning"
       codec => multiline{ #使用codec插件,相当于转换格式,使用多行合并参数,适合java日志收集
          pattern => "^\[" # 设置正则匹配。根据自己java日志格式来设置 
          negate => true   
          what => "previous" #匹配到正则则和上文合并
        }
}
}

filter{
}

output{
  if [type] == "system-log" { #做判断,区分不同的日志类型 
    elasticsearch {
            hosts => ["10.201.1.145:9200"]
            index => "system-log-%{+YYYY.MM}"
        }  
 }
  if [type] == "es-log" {
    elasticsearch {
            hosts => ["10.201.1.145:9200"]
            index => "es-log-%{+YYYY.MM}"
        }  
 }
}
  1. 收集nginx日志

需要先把nginx的日志类型改为json

log_format  access_log_json '{"user_ip":"$http_x_real_ip","lan_ip":"$remote_addr","log_time":"$time_iso8601","user_req":"$request","http_code":"$status","body_bytes_sent":"$body_bytes_sent","req_time":"$request_time","user_ua":"$http_user_agent"}';

写配置文件

cat /etc/logstash/conf.d/nginx.conf 
input{
  file {
    path => "/var/log/nginx/access.log_json"
    codec => "json"
}
}

filter{

}

output{
  elasticsearch {
            hosts => ["10.201.1.145:9200"]
            index => "nginx-access-log-%{+YYYY.MM.dd}"
        }  
}
  1. 收集rsyslog日志log

修改要收集日志主机的rsyslog配置文件

[root@k8s-m1 ~]# tail -2 /etc/rsyslog.conf 
*.* @@10.201.1.146:514
# ### end of the forwarding rule ###

编写收集配置文件

[root@k8s-n1 ~]# cat rsyslog.conf 
input{
  syslog {
    type => "system-syslog"
    port => 514
}
}
filter{

}
output{
  elasticsearch {
    hosts => ["10.201.1.146:9200"]
    index => "system-syslog-%{+YYYY.MM}"
}
}
  1. 收集TCP日志

编写配置文件

[root@k8s-n1 ~]# cat tcp.conf 
input{
 tcp {
    port => 6666
    mode => "server"
    type => "tcp" 
}
}
output{
  stdout {
   codec => rubydebug
}
}

用另一台机器,发信息验证(下面列举几种方法)

yum -y install nc
echo "lxd" | nc 10.201.1.146 6666
nc 10.201.1.146 6666 < /etc/resolv.conf
echo "123" > /dev/tcp/10.201.1.146/6666
  1. 收集Apache日志
[root@k8s-m1 ~]# cat apache.conf 
input {
  file {
    path => "/var/log/httpd/access_log"
    type => "apache_log"
    start_position => "beginning"
 }
}
filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
 } 
}
output {
  elasticsearch {
    hosts => ["10.201.1.145:9200"]
    index => "apache-log-%{+YYYY.MM.dd}"
 }
}

前台运行,然后去登录es查看收集的日志
http://10.201.1.145:9200/_plugin/head/

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/file.conf 

ELK搭建,使用。_第4张图片

  • 至此,logstash安装完毕,功能正常使用

3、146安装kibana

Kibana 是为 Elasticsearch 设计的开源分析和可视化平台。你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化,以图表的形式展现出来。

  • RPM安装kibana
rpm -ivh kibana-4.5.4-1.x86_64.rpm
rpm -ql kibana
  • 修改配置文件
grep '^[a-z]'  /opt/kibana/config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://10.201.1.145:9200"
kibana.index: ".kibana"
  • 启动服务
/etc/init.d/kibana start
netstat -lntpu | grep 5601
  • 初次访问kibana,并做初始化配置

浏览器访问:http://10.201.1.146:5601

添加在es中创建的索引

ELK搭建,使用。_第5张图片
ELK搭建,使用。_第6张图片

查看收集到的日志信息

ELK搭建,使用。_第7张图片

  • 至此,kibana搭建完成,测试OK