• 日志管理系统ELK6.2.3


    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
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    【Python开发】python使用urllib2抓取防爬取链接
    【Python开发】python使用urllib2抓取防爬取链接
    【Python开发】Python之re模块 —— 正则表达式操作
    【Python开发】Python之re模块 —— 正则表达式操作
    【Python开发】Url中文字符时记得转码edcode("utf-8")
    【Python开发】Url中文字符时记得转码edcode("utf-8")
    【Python开发】urllib2异常处理
    【Python开发】urllib2异常处理
    【Python开发】urllib2.urlopen超时问题
    【Python开发】urllib2.urlopen超时问题
  • 原文地址:https://www.cnblogs.com/wangmo/p/9505883.html
Copyright © 2020-2023  润新知