基于Centos搭建ELK环境指南

前端之家收集整理的这篇文章主要介绍了基于Centos搭建ELK环境指南前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

无论是甲方还是一方都需要面对大量日志处理的情况,之前分析的时候用基本的shell命令进行处理,但是面对大量数据的时候则有些力不从心,而且面对纯文字也不大直观。后来有人推荐了ELK,最近ELK升级到了版本五。E, L, K三大组件统一了版本号,花了一段时间总算搭好了。

基本环境信息:

操作系统:CentOS 6.9 x64

java版本号:1.8.0_131

ELK: 5.5

0×01 安装java

ELK需要最新的java1.8.CentOS自带了openjdk1.7,删了重新安装oracle java

  1. yum remove java

然后从oracle官网(http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)下载java的源码包

  1. mkdir /usr/java
  2. tar -zxvf jdk-8u131-linux-x64.tar.gz -C /usr/java/

编辑/etc/profile

  1. JAVA_HOME=/usr/java/jdk1.8.0_131
  2.  
  3. JRE_HOME=/usr/java/jdk1.8.0_131/jre
  4.  
  5. PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
  6.  
  7. CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
  8.  
  9. export PATH=$PATH:$JAVA_HOME:$JRE_HOME:$CLASSPATH

创建java的软连接

  1. cd /usr/bin
  2.  
  3. ln -s /usr/java/jdk1.8.0_131/bin/java java

如图,安装成功

2. 安装elasticsearch

去elk官网下载elasticsearch的rpm包,

直接安装

  1. rpm -ivh elasticsearch-5.5.0.rpm

启动测试

  1. /etc/init.d/elasticsearch start

如图,安装成功

清空elasticsearch的数据

  1. curl -XDELETE 'http://127.0.0.1:9200/logstash-*'

配置一下权限

  1. cd /var/lib

    chmod -R 777 logstash

3. 安装kibana

还是从官网下载kibana的二进制包

  1. rpm -ivh kibana-5.5.0-x86_64.rpm

启动

  1. /etc/init.d/kibana start

如图所示,kibaba也安装成功了,现在kibana只能从本地访问,为了方便调试,利用Nginx做一下反向代理

  1. yum install Nginx
  2.  
  3. #/etc/Nginx/conf.d/default.conf
  4.  
  5. server {
  6.  
  7. listen 80;
  8.  
  9. location / {
  10.  
  11. proxy_pass [http://localhost:5601](http://localhost:5601);
  12.  
  13. }
  14.  
  15. }

4. 安装logstash

安装logstash和之前的步骤一样,但是logstash是没有独立的守护服务的

安装后的路径

  1. /usr/share/logstash/

创建config的软连接

  1. cd /usr/share/logstash
  2.  
  3. ln -s /etc/logstash ./config

Logstash配置文件是JSON格式,放在/etc/logstash/conf.d 。 该配置由三个部分组成:输入,过滤器和输出

input 数据输入端,可以接收来自任何地方的源数据。

file:从文件中读取

syslog:监听在514端口的系统日志信息,并解析成RFC3164格式。

redis:从redis-server list 中获取

beat:接收来自Filebeat的事件

Filter 数据中转层,主要进行格式处理,数据类型转换、数据过滤、字段添加修改等,常用的过滤器如下。

grok: 通过正则解析和结构化任何文本。Grok 目前是logstash最好的方式对非结构化日志数据解析成结构化和可查询化。logstash内置了120个匹配模式,满足大部分需求。

mutate: 在事件字段执行一般的转换。可以重命名删除、替换和修改事件字段。

drop: 完全丢弃事件,如debug事件。

clone: 复制事件,可能添加或者删除字段。

geoip: 添加有关IP地址地理位置信息。

output 是logstash工作的最后一个阶段,负责将数据输出到指定位置,兼容大多数应用,常用的有:

elasticsearch: 发送事件数据到 Elasticsearch,便于查询,分析,绘图。

file: 将事件数据写入到磁盘文件上。

mongodb:将事件数据发送至高性能Nosql mongodb,便于永久存储,查询,分析,大数据分片。

redis:将数据发送至redis-server,常用于中间层暂时缓存。

graphite: 发送事件数据到graphite。http://graphite.wikidot.com/

statsd: 发送事件数据到 statsd。

其中input和output是必须的,logstash由一个e参数,可以在终端调试配置文件

最简单的输入输出

  1. /usr/share/logstash/bin# ./logstash -e 'input { stdin { } } output { stdout {} }'

采用格式化输出

  1. logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }'

这边,我们是从终端输入,同时也从终端输出,但在实际状况中几乎不可能这么做,那先打通输出环节吧,把输出内容发送到

Elasticsearch

首先启动Elasticsearch,确保9200端口开着,前边已经启动了。然后执行

  1. ./logstash -e 'input { stdin { } } output { elasticsearch { hosts => localhost } }'

确认一下

  1. curl 'http://localhost:9200/_search?pretty'

logstash的e参数调试是很方便,但是内容多的话就不方便了,logstash还有一个f参数,用来从配置文件中读取信息,简单示例

  1. #logstash_simple.conf
  2.  
  3. input { stdin { } }
  4.  
  5. output {
  6.  
  7. elasticsearch { hosts => localhost }
  8.  
  9. }
  10.  
  11. # ./logstash -f ../config/logstash_simple.conf
  12.  
  13. ![75879570.png](http://image.3001.net/images/20170708/14995011356598.png!small)
  14.  
  15. ![75898507.png](http://image.3001.net/images/20170708/14995011414518.png!small)
  16.  
  17. 然后说一下过滤器
  18.  
  19. #logstash.conf
  20.  
  21. input { stdin {} }
  22.  
  23. filter {
  24.  
  25. grok {
  26.  
  27. match => ["message","%{COMBINEDAPACHELOG}"]
  28.  
  29. }
  30.  
  31. }
  32.  
  33. output {
  34.  
  35. elasticsearch { hosts => localhost }
  36.  
  37. }

filter 以何种规则从字符串中提取出结构化的信息,grok是logstash里的一款插件,可以使用正则表达式匹配日志,上文中的%{COMBINEDAPACHELOG}是内置的正则,用来匹配apache access日志.

测试信息

  1. 127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.PHP HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.PHP" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"

  1. curl 'http://localhost:9200/_search?pretty'

分析本地的apache日志文件

首先启动elasticsearch

  1. /etc/init.d/elasticsearch start

然后创建logstash的json文件

  1. #logstash_apache.conf
  2.  
  3. input {
  4.  
  5. file {
  6.  
  7. path => "/tmp/access.log"
  8.  
  9. type => "apache"
  10.  
  11. start_position => "beginning"
  12.  
  13. }
  14.  
  15. }
  16.  
  17. filter {
  18.  
  19. grok {
  20.  
  21. match => {
  22.  
  23. "message" => "%{COMBINEDAPACHELOG}"
  24.  
  25. }
  26.  
  27. }
  28.  
  29. date {
  30.  
  31. match => [ "timestamp","dd/MMM/YYYY:HH:mm:ss Z"]
  32.  
  33. }
  34.  
  35. }
  36.  
  37. output {
  38.  
  39. elasticsearch { hosts => localhost }
  40.  
  41. }

启动logstash

  1. ./logstash -f ../config/logstash_apache.conf

根据日志的时间修改一下时间段

然后是我最喜欢的功能,基于IP的地理位置显示

5.利用filebeat和redis搭建实时分析环境

下载安装redis

  1. yum install redis
  2.  
  3. /etc/init.d/redis start

filebeat从官网下载rpm包直接安装即可

在filebeat中,/var/lib/filebeat/registry是文件读取的记录,为了让filebeat从头开始读,把他删了

修改filebeat配置文件

  1. filebeat.prospectors:
  2.  
  3. - type: log
  4.  
  5. paths:
  6.  
  7. - /var/log/httpd/access_log
  8.  
  9. tail_files: false
  10.  
  11. #- input_type: log
  12.  
  13. # paths:
  14.  
  15. # - /var/log/Nginx/*.log
  16.  
  17. # encoding: utf-8
  18.  
  19. # document_type: my-Nginx-log
  20.  
  21. # scan_frequency: 10s
  22.  
  23. # harvester_buffer_size: 16384
  24.  
  25. # max_bytes: 10485760
  26.  
  27. # tail_files:
  28.  
  29. output.redis:
  30.  
  31. enabled: true
  32.  
  33. hosts: ["127.0.0.1:6379"]
  34.  
  35. key: "filebeat"
  36.  
  37. db: 0
  38.  
  39. worker: 1
  40.  
  41. timeout: 5s
  42.  
  43. max_retries: 3
  44.  
  45. #output.console:
  46.  
  47. # pretty: true

启动filebeat

  1. filebeat -e -c /etc/filebeat/shadow.yml

去redis检查一下

有filebeat证明检查成功

既然redis和filebeat的通道打通了,然后就是打通redis和elasticsearch

  1. #/usr/share/logstash/config/logstash_index.conf
  2.  
  3. input {
  4.  
  5. redis { #去redis队列取数据;
  6.  
  7. host => "127.0.0.1" #连接redis服务器;
  8.  
  9. port => 6379 #连接redis端口;
  10.  
  11. data_type => "list" #数据类型;
  12.  
  13. key => "filebeat" #队列名称
  14.  
  15. batch_count => 1
  16.  
  17. }
  18.  
  19. }
  20.  
  21. filter {
  22.  
  23. grok {
  24.  
  25. match => ["message","%{COMBINEDAPACHELOG}"]
  26.  
  27. }
  28.  
  29. date {
  30.  
  31. match => [ "timestamp","dd/MMM/yyyy:HH:mm:ss Z" ]
  32.  
  33. }
  34.  
  35. }
  36.  
  37. output {
  38.  
  39. elasticsearch { #Logstash输出到elasticsearch;
  40.  
  41. hosts => ["localhost:9200"] #elasticsearch为本地;
  42.  
  43. index => "logstash-apache-%{+YYYY.MM.dd}" #创建索引;
  44.  
  45. document_type => "apache" #文档类型;
  46.  
  47. workers => 1 #进程数量
  48.  
  49. flush_size => 20000
  50.  
  51. idle_flush_time => 10
  52.  
  53. }
  54.  
  55. #stdout{codec => rubydebug}
  56.  
  57. }
  1. ./logstash -f ../config/logstash_index.conf

访问一下apache服务器,请求变成了6个

6.配置守护进程

每次启动的程序和服务太多了,为了避免麻烦用supervisor放到后台

  1. yum install supervisor

配置文件

  1. #/etc/supervisord.conf
  2. [program:iptables]
  3.  
  4. command=/etc/init.d/iptables stop
  5.  
  6. user=root
  7.  
  8. stdout_logfile=/tmp/elk/iptables.log
  9. [program:Nginx]
  10.  
  11. command=Nginx
  12.  
  13. user=root
  14.  
  15. stdout_logfile=/tmp/elk/Nginx.log
  16. [program:redis]
  17.  
  18. command=/etc/init.d/redis start
  19.  
  20. user=root
  21.  
  22. stdout_logfile=/tmp/elk/redis.log
  23. [program:kibana]
  24.  
  25. command=/etc/init.d/kibana start
  26.  
  27. user=root
  28.  
  29. stdout_logfile=/tmp/elk/kibana.log
  30.  
  31. stderr_logfile=/tmp/elk/kibana_error.log
  32. [program:filebeat]
  33.  
  34. command=/usr/share/filebeat/bin/filebeat -c /etc/filebeat/shadow.yml
  35.  
  36. user=root
  37.  
  38. stdout_logfile=/tmp/elk/filebeat.log
  39. [program:logstash]
  40.  
  41. command=/usr/share/logstash/bin/logstash -f /usr/share/logstash/config/logstash_index.conf
  42.  
  43. user=root
  44.  
  45. stdout_logfile=/tmp/elk/logstash.log
  46. [program:elasticsearch]
  47.  
  48. command=/etc/init.d/elasticsearch start
  49.  
  50. user=root
  51.  
  52. stdout_logfile=/tmp/elk/elasticsearch.log
  53.  
  54. stderr_logfile=/tmp/elk/ela_err.log
  55. [supervisord]

开机一条命令搞定

  1. supervisord -c /etc/supervisord.conf

*本文作者:s1riu5,转载请注明FreeBuf.COM

发表评论

已有 5评论

  • softbug (7级) 011101000110100001100001011011... 2017-07-12 回复 1楼

    搭建实时环境的时候,为何不继续用logstash?

    亮了( 0)
    • s1riu5 (4级) 黑客,极客,历史爱好者 2017-07-12 回复

      @ softbug 主要考虑到面对业务系统数量繁多的分散日志,redis可以方便的进行分布式扩展和存储。而且有个缓冲用的中间件,可以有效减少遇到意外时的日志丢失状况

      亮了( 0)
  • hdog 2017-07-12 回复 2楼

    网上这样的教程都一大堆了,能给点干货吗?

    亮了( 0)
  • code3322 (1级) 2017-07-12 回复 3楼

    实例呢!都没见到你写处理什么样的数据,中间会遇到什么问题,尽是些一路都成功的!

    亮了( 0)
  • didi 2017-07-12 回复 4楼

    elasticsearch能用root用户运行?

猜你在找的CentOS相关文章