日志管理系统ELK6.2.3

你说的曾经没有我的故事 提交于 2019-12-21 04:00:54

https://www.jianshu.com/p/88f2cbedcc2a

写在前面

刚毕业工作的时候,处理日志喜欢自己写脚本抓取数据分析日志,然后在zabbix上展示出来。但是开发要看日志的时候,还是要登录服务器,使用tailf、grep加一些正则,很是麻烦。来到一个新环境,需要搭建一套日志管理系统,接触了elk,相见恨晚,记录下自己从零开始学习使用elk的过程。

日志管理系统ELK

目录

  • 部署架构图
  • 部署版本
  • 部署地址
  • 服务部署
  • 总结

部署架构图:

 
elk.png

部署前了解:

1、elk现在又叫elfk,是elasticsearch、logstash、filebeat、kibana的简称。
2、elk架构类似于C/S,由客户端的日志收集工具收集日志,服务端的日志收集工具收集分析客户端的日志。之前客户端的日志收集工具logstash是用java写的,比较占用内存,为了不给生产环境造成负担,生产环境上的日志收集工具换成了用go语言写的filebeat,filebeat将日志收集到redis里面,利用redis做消息队列,服务端的logstash从redis里面取数据,分析,传到elasticsearch,最后用kibana展示出来
3、本次安装是安装在内网,故没有考虑到安全的问题,安装过程中会提到
4、本次安装是基于debian,如果是centos注意从官网下载不同的软件包、还要注意防火墙、selinux等问题。安装过程是大同小异的
5、本次安装时,日志量不算大,所以es用的是单机

部署版本:

filebeat:6.2.3
redis: 2.8.17
logstash:6.2.3
elasticsearch:6.2.3
kibana:6.2.3

部署地址:

服务服务器地址系统部署目录
filebeat log debian8.9 /app/elk
redis elk debian8.9  
logstash elk debian8.9 /app/elk/logstash-6.2.3
elasticsearch elk debian8. 9 /app/elk/elasticsearch-6.2.3
kibana elk debian8. 9 /app/elk /kibana-6.2.3-linux-x86_64

服务部署:

1、redis:

考虑到logstash直接把日志丢给es,会导致es吃不消,故加了一个redis做队列缓存。也可以用kafka之类的,都是官网推荐,这里用redis,因为简单,而且做队列用,不占内存

redis直接安装就行
apt-get install redis-server
配置文件地址:/etc/redis/redis.conf

1、启动
service redis-server start
2、查看日志:
tailf /var/log/redis/redis-server.log
3、报警告:
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
按照建议做,不然有可能导致数据丢失

4、报错:

[20109] 27 Mar 10:28:17.052 * Background saving started by pid 20760
[20760] 27 Mar 10:28:17.052 # Failed opening .rdb for saving: Permission denied

没有权限导致持久化失败
解决:
chmod 755 dump.rdb

5、关于安全建议:

  • redis内网通信
  • 修改默认端口号,开启账号密码登录
  • 打开防火墙,添加白名单

6、测试:
在需要收集日志的客户端telnet下redis加port,确保通信没问题

2、Elasticsearch

1、安装目录:
/app/elk/elasticsearch-6.2.3

2、安装依赖:
es是用java写的,所以需要安装jdk1.8,这里用oracle_jdk1.8,openjdk和其他版本的支持不支持elk6.2.3我不清楚
jdk1.8的安装:
2.1、下载jdk至指定目录 /usr/local
jdk1.8:http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" -P /usr/local http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz

2.2、解压
tar zxvf /usr/local/jdk-8u162-linux-x64.tar.gz -C /usr/local/

2.3、配置环境变量

export JAVA_HOME=/usr/local/jdk1.8.0_162
export JAVA_BIN=/usr/local/jdk1.8.0_162/bin
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jart

4、安装es:

cd /app/elk 
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.deb
tar zxvf elasticsearch-6.2.3.tar.gz

配置文件:/app/elk/elasticsearch-6.2.3/config/elasticsearch.yml

ath.data: /app/elk/elasticsearch-6.2.3/data
path.logs: /app/elk/elasticsearch-6.2.3/logs
network.host: ip      ####这里写es服务器的ip

5、创建elk账号
为了安全起见,es不支持以root用户启动,所以先创建elk账号

####debian创建账号,赋予sudo权限。其他linux发行版的命令可以自行google
adduser elk
groups elk
usermod -aG sudo elk
visudo
添加: elk    ALL=(ALL) NOPASSWD: ALL


chown -R elk.elk /app/elk

6、启动:
切换用户,启动。我这里图省事就直接nohup启动了。正规点的可以用screen、supervisor这些,别忘了加入开机自启动

su elk
nohup /app/elk/elasticsearch-6.2.3/bin/elasticsearch  > /var/log/es.log 2>&1 &

7、查看nohup.out日志,检查报错
看有没有报错:如果报错,需要设置文件打开数和vm.max_map_count,那么就进行修改,

文件打开数:
vim /etc/security/limits.conf

root soft nofile 65535
root hard nofile 65535
* soft nofile 65536
* hard nofile 65535

elk soft nofile 655350
elk hard nofile 655350

jvm最大线程数:
sysctl -w vm.max_map_count=262144
其他错误请自行Google

8、启动成功:
查看es
ip和端口需要和配置文件保持一致
curl http://ip:9200

9、安全建议:

  • es加账号密码
  • 通信用tls

至此,单机版的es就算安装成功了。O(∩_∩)O

3、filebeat

1、安装机器:需要收集日志的机器
安装目录:/app/

debian安装:

cd /app/elk
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.3-amd64.deb
sudo dpkg -i filebeat-6.2.3-amd64.deb

2、配置文件:/etc/filebeat/filebeat.yml
配置:

####收集日志的位置,标签
filebeat.prospectors:

- type: log

  enabled: true

  paths:
    - /var/log/nginx/access.log
  fields:
    list: access.log
    
    
    
####配置文件模板地址,是否自动加载 
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml

  reload.enabled: false



setup.template.settings:
  index.number_of_shards: 3


####收集的日志输出到的地方,这里是用了redis的消息队列功能
output.redis:
  hosts: ["ip"]                 ##redis  ip
  port: port                     ##redis  port
  key: "%{[fields.list]}"        ##key值,这里用了变量,好归类不同的日志
  db : 5                         ##db库,自由选择


3、启动:
service filebeat start
4、检查:
启动后,可以进入redis的对应db里面,使用keys * 查看未消费的队列,如果没有消费完,那么应该能看到list值,这里是access.log。说明日志已经收集到redis缓存里面了。

4、logstash

logstash是收集处理日志用的,跟filebeat差不多,最大的区别是logstash自带graok解析、切割日志,而filebeat功能没这么强大,但是filebeat用go写,轻量,不占内存,故可以放到客户端收集日志,服务端还是用logstsh

1、目录:/app/elk/logstash

cd /app/elk/
wge https://artifacts.elastic.co/downloads/logstash/logstash-6.2.3.deb
tar zxvf  logstash-6.2.3.tar.gz

2、logstash的配置文件:/app/elk/logstash-6.2.3/config/logstash.yml

path.data: /app/elk/logstash-6.2.3/data
path.logs: /app/elk/logstash-6.2.3/logs

3、日志收集的配置文件:/app/elk/logstash-6.2.3/conf/
分为三部分:

  • input:日志的来源,这里来源是之前收集缓存日志的redis
  • filter:日志切割,有没有这一块也能用,这是优化显示的日志用的
  • output:日志输出的地方,参考架构图,输出到es

这里贴出我的,略去了敏感字段

#--------------------------------This  is  input setting-----------------------------------------

input {
  redis {
    host => "ip"
    type => "test.access.log"
    data_type => "list"
    key => "test.access.log"
    port => "6379"
    db => 5
  }

  redis {
    host => "ip"
    type => "test.error.log"
    data_type => "list"
    key => "test.error.log"
    port => "6379"
    db => 5
  }



}



#--------------------------------This is  filter setting----------------------------------------

filter {
         if [type] == "test.access.log"{

         grok{

              match => {"message" => "%{IP:clientip} - - \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})\" %{NUMBER:response}" }
               }

         geoip {
              source => "clientip"
              target => "geoip"
              database => "/app/elk/logstash-6.2.3/etc/GeoLite2-City.mmdb"
              add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
              add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
          }

         mutate {
             convert => [ "[geoip][coordinates]", "float"]
                }
    }
}






#-------------------------------This is  output setting---------------------------------------
output {

        if [type] == "test.access.log"{

                 elasticsearch { hosts => ["ip:9200"] index => "test.access.log"}

        }

        if [type] == "test.error.log"{

                 elasticsearch { hosts => ["ip:9200"] index => "test.error.log"}

        }


  stdout { codec => rubydebug }
}

6、启动:nohup /app/elk/logstash-6.2.3/bin/logstash -f /app/elk/logstash-6.2.3/conf > /app/elk/logstash-6.2.3/nohup.out 2>&1 &

5、kibana

1、目录:/app/elk/kibana-6.2.3-linux-x86_64

cd /app/elk
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-linux-x86_64.tar.gz
tar zxvf kibana-6.2.3-linux-x86_64.tar.gz

2、配置文件:

server.port: port

server.host: ip



server.name: name

elasticsearch.url: "http://ip:9200"


tilemap.url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'

3、启动:nohup /app/elk/kibana-6.2.3-linux-x86_64/bin/kibana > /var/log/kibana.log 2>&1 &

4、检查:
打开 刚设置的 http://ip:port,就可以看到kibana界面了。

安全建议:
kibana没有账号登录的功能,需要依赖插件X-pack,但是x-pack 不是免费的,所以可以用nginx的auth登录

总结:

至此,elk就搭建完毕了,大家可以到kikana上建立索引,自由查看日志了

由于elk版本较多,网络上的教程质量也是参差不齐,大家搭建的时候,要以官方文档为准,配置文件的写法,也要以官方文档为准。然后启动前要测试,启动的时候要注意查看日志。

后续文档内容:kibana的使用、elk结合钉钉告警、logstash配置文件的写法

贴一个日志分析图,具体实现参考后续文档。


 
elk.png


作者:OrangeLoveMilan
链接:https://www.jianshu.com/p/88f2cbedcc2a
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!