2014年9月22日 星期一

使用ELK(Elastic Search、Logstash、Kibana)建立Log查詢、蒐集與分析系統


公司想要開始要建立統一的Log查詢、蒐集與分析的環境,因此嘗試使用ELK來建立。

環境說明

先嘗試建立Standalone的環境,也就是ELK都先放在同一台。
  • 作業系統: CentOS 6.5 final
  • Elastic Search 1.3.2
  • Logstash 1.4.2
  • Kibana

參考資料


軟體安裝

  1. 作業系統安裝

    • 請記得安裝已下套件
      • Apache httpd (yum install httpd)
      • Java 7 SDK
  2. 安裝Elastic Search

    • 下載公鑰
      rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch
    • 在 /etc/yum.repos.d/ 目錄下新增檔案,例如 elasticsearch.repo,內容如下
      [elasticsearch-1.3]
      name=Elasticsearch repository for 1.3.x packages
      baseurl=http://packages.elasticsearch.org/elasticsearch/1.3/centos
      gpgcheck=1
      gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
      enabled=1
    • 安裝Elastersearch
      yum install elasticsearch

      image
  3. 設定Elasticsearch



    • 編輯 /etc/elasticsearch/elasticsearch.yml ,加入

      cluster.name: "LogCluster"
      node.name: "LogMaster"
      node.master: true
      node.data: true
      
      path.conf: /etc/elasticsearch
      path.data: /datapool/data1
      path.work: /datapool/work
      path.logs: /datapool/log
    • 將服務加入系統
      chkconfig --add elasticsearch

    • 啟動服務
      /etc/init.d/elasticsearch start

    • 測試啟動是否成功
      curl localhost:9200/_nodes/process?pretty
      
      {
        "cluster_name" : "LogCluster",
        "nodes" : {
          "sqhS68RMS3q1CtthFOdSxw" : {
            "name" : "LogMaster",
            "transport_address" : "inet[/10.10.10.151:9300]",
            "host" : "logserver",
            "ip" : "127.0.0.1",
            "version" : "1.3.2",
            "build" : "dee175d",
            "http_address" : "inet[/10.10.10.151:9200]",
            "attributes" : {
              "master" : "true"
            },
            "process" : {
              "refresh_interval_in_millis" : 1000,
              "id" : 30839,
              "max_file_descriptors" : 65535,
              "mlockall" : false
            }
          }
        }
      }
      

  4. 安裝Logstash



    • 參考資料:http://logstash.net/docs/1.4.2/repositories
    • 安裝金鑰
      rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch
    • 在 /etc/yum.repos.d/ 目錄下新增檔案,例如 logstash.repo,內容如下
      [logstash-1.4]
      name=logstash repository for 1.4.x packages
      baseurl=http://packages.elasticsearch.org/logstash/1.4/centos
      gpgcheck=1
      gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
      enabled=1
    • 安裝Logstash
      yum install logstash
      image

  5. 安裝Kibana



    • Kibana是一個純粹由javascript/CSS/html組成的套件,安裝好logstash之後可以在 /opt/logstash/vendor/kibana 目錄下找到。
    • 複製到httpd的 /var/www/html/ 目錄之下
      cp -R /opt/logstash/vendor/kibana/* /var/www/html/
    • 啟動httpd服務
      chkconfig httpd on
      
      /dev/init.d/httpd start
  6. 設定防火牆



    • 預設的防火牆是沒有開啟http及elastersearch的port,請加入以下兩個規則
      #
      # 開啟HTTP 80 port
      #
      iptables -A INPUT -p tcp --dport 80 -j ACCEPT
      #
      # 設定ElasticSearch使用的port 9200-9300
      #
      iptables -A INPUT -p tcp --dport 9200:9300 -j ACCEPT
      

  7. 開始使用



    • 用瀏覽器進入 http://<Server Address>/

image




待續…



  1. Logstash接收log設定值

  2. Kibana設定與使用

  3. Elastersearch進階設定

  4. and more…

19 則留言:

  1. 您好!
    最近也在學ELK
    想請教如何改IP 讓其他USER從web觀看
    而不是只限在本機觀看
    麻煩指導一下

    謝謝

    回覆刪除
    回覆
    1. 這篇設定做完就可以從 web上觀看了才對,會不會您的防火牆設定沒開,我有寫在第6小節中喔

      刪除
  2. 我沒有開防火牆勒
    http://s881.photobucket.com/user/vertexgrp/media/setup_zps43834eaa.jpg.html
    我的IP是10.5.1.111
    在本機用localhost可以正常收數據
    http://s881.photobucket.com/user/vertexgrp/media/ok_zpsd2548606.jpg.html
    但在本機用10.5.1.111就會出現錯誤
    http://i881.photobucket.com/albums/ac12/vertexgrp/error1_zps4c9fed5c.jpg
    在其他電腦用10.5.1.111登入則是一片空白
    http://i881.photobucket.com/albums/ac12/vertexgrp/error2_zpsf6409528.jpg
    可以教我如何除錯嗎

    感恩哦

    回覆刪除
    回覆
    1. 你可以參考一下另外一篇 http://zettadata.blogspot.tw/2014/09/elkelasticsearch.html
      這裡會有解決的方式,謝謝

      刪除
  3. 作者已經移除這則留言。

    回覆刪除
  4. 獨角獸先進您好:

    curl localhost:9200/_nodes/process?pretty

    "transport_address" : "inet/10.10.10.151:9300]",
    "host" : "logserver", "ip" : "127.0.0.1",
    "version" : "1.3.2", "build" : "dee175d",
    "http_address" :
    "inet[/10.10.10.151:9200]",
    我在跑這個指令時不會跟你列的一樣
    請問那個transport 跟 http address
    是在哪裡做設定的

    是否方便提供您的ELK相關設定檔寄給我參考一下
    測試很久都測不出來整合的部份
    感恩
    vertexgrp@hotmail.com

    回覆刪除
  5. 跟您設定有一點差異,現在是可以收資料了
    但測試2次 資料收集一段時間便會當掉停止收集
    第一次收了五十幾萬筆
    第二次收了十幾萬筆

    請問該如何除錯
    請再幫忙指導一下

    謝謝啦

    回覆刪除
    回覆
    1. 請查一下 /var/log/logstash 下面的log檔案,以及 /var/log/elasticsearch下面的log檔案
      看看是哪部分出了問題。

      刪除
  6. logstash.err錯誤訊息如下:

    Error: Your application used more memory than the safety cap of 500M.
    Specify -J-Xmx####m to increase it (#### = cap size in MB).
    Specify -w for full OutOfMemoryError stack trace

    elasticsearch 的LOG 如下:

    [2014-12-19 09:23:34,791][WARN ][monitor.jvm ] [Debra Whitman] [gc][young][4224][4931] duration [2.2s], collections [2]/[3.7s], total [2.2s]/[11.4m], memory [752.8mb]->[210.9mb]/[990.7mb], all_pools {[young] [198.5mb]->[16.6mb]/[266.2mb]}{[survivor] [33.2mb]->[0b]/[33.2mb]}{[old] [521mb]->[194.3mb]/[691.2mb]}
    [2014-12-19 09:36:17,486][WARN ][monitor.jvm ] [Debra Whitman] [gc][young][4953][5725] duration [4.4s], collections [1]/[5.7s], total [4.4s]/[13.4m], memory [636.6mb]->[152.8mb]/[990.7mb], all_pools {[young] [2.7mb]->[1mb]/[266.2mb]}{[survivor] [33.2mb]->[0b]/[33.2mb]}{[old] [600.6mb]->[151.7mb]/[691.2mb]}
    [2014-12-19 10:01:25,952][WARN ][monitor.jvm ] [Debra Whitman] [gc][young][6401][7286] duration [4.1s], collections [1]/[5s], total [4.1s]/[17.3m], memory [877.5mb]->[185.8mb]/[990.7mb], all_pools {[young] [233.6mb]->[4.7mb]/[266.2mb]}{[survivor] [33.2mb]->[0b]/[33.2mb]}{[old] [610.6mb]->[181.1mb]/[691.2mb]}
    [2014-12-19 10:07:06,749][WARN ][monitor.jvm ] [Debra Whitman] [gc][young][6711][7619] duration [11.9s], collections [1]/[13.3s], total [11.9s]/[18.2m], memory [653.6mb]->[231.2mb]/[990.7mb], all_pools {[young] [2.6mb]->[1mb]/[266.2mb]}{[survivor] [33.2mb]->[0b]/[33.2mb]}{[old] [617.8mb]->[230.2mb]/[691.2mb]}
    [2014-12-19 10:50:43,624][WARN ][monitor.jvm ] [Debra Whitman] [gc][young][9209][10319] duration [15.3s], collections [2]/[17s], total [15.3s]/[25.1m], memory [819.3mb]->[185.4mb]/[990.7mb], all_pools {[young] [256.1mb]->[954.4kb]/[266.2mb]}{[survivor] [33.2mb]->[0b]/[33.2mb]}{[old] [529.9mb]->[184.5mb]/[691.2mb]}
    [2014-12-19 11:20:03,381][WARN ][monitor.jvm ] [Debra Whitman] [gc][young][10889][12129] duration [5.4s], collections [1]/[6.9s], total [5.4s]/[29.6m], memory [754.9mb]->[177.3mb]/[990.7mb], all_pools {[young] [129.1mb]->[8.5mb]/[266.2mb]}{[survivor] [33.2mb]->[0b]/[33.2mb]}{[old] [592.5mb]->[168.7mb]/[691.2mb]}
    [2014-12-19 11:47:54,971][WARN ][monitor.jvm ] [Debra Whitman] [gc][young][12463][13828] duration [19.5s], collections [1]/[21.3s], total [19.5s]/[34.1m], memory [715.1mb]->[170.9mb]/[990.7mb], all_pools {[young] [77.7mb]->[3.2mb]/[266.2mb]}{[survivor] [33.2mb]->[0b]/[33.2mb]}{[old] [604.2mb]->[167.7mb]/[691.2mb]}
    [2014-12-19 11:48:10,000][INFO ][cluster.service ] [Debra Whitman] removed {[Jackson Arvad][rZrBKZktQgOSydfYq4GW3g][localhost.localdomain][inet[/10.5.1.111:9301]]{client=true, data=false},}, reason: zen-disco-node_failed([Jackson Arvad][rZrBKZktQgOSydfYq4GW3g][localhost.localdomain][inet[/10.5.1.111:9301]]{client=true, data=false}), reason transport disconnected (with verified connect)

    我的測試環境是在VM
    centos 7.0
    記憶體4G

    請問該在哪裡修改記憶體的設定
    麻煩先進再教導一下
    感恩

    回覆刪除
  7. logstash的預設記憶體的確是500M
    請用root帳號開啟 /etc/init.d/logstash檔案,找到下面這一行
    LS_HEAP_SIZE="500M"
    修改以上設定的記憶體大小即可。

    然後記得重啟服務
    /etc/init.d/logstash restart

    回覆刪除
  8. 有自己找到在哪改了,謝謝大大
    想再請教一下

    要怎麼把 windows .LINUX &VM.或其他網路設備的LOG,加到這裡來做監控

    感謝指導哦

    回覆刪除
  9. 改了記憶體設定後反而變更糟,XD!
    收不到幾筆就掛了

    先進可以分享一下您的logstash跟elasticsearch的設定嗎

    我把記憶體再加到8G
    一樣一下就死當了!

    感謝指導啦

    回覆刪除
    回覆
    1. 補充elasticsearch設定檔內容(etc/elasticsearch/elasticsearch.yml)

      cluster.name: "LogCluster"
      node.name: "LogMaster"
      node.master: true
      node.data: true

      path.conf: /etc/elasticsearch
      path.data: /datapool/data1
      path.work: /datapool/work
      path.logs: /datapool/log

      script.disable_dynamic: true
      network.host: localhost

      logstash設定檔
      input {
      file {
      path => "/var/log/httpd/access_log"
      type => "apache" # a type to identify those logs (will need this later)
      }
      }

      filter {
      if [type] == "apache" { # this is where we use the type from the input section
      grok {
      match => [ "message", "%{COMBINEDAPACHELOG}" ]
      }
      date {
      # Try to pull the timestamp from the 'timestamp' field (parsed above with
      # grok). The apache time format looks like: "18/Aug/2011:05:44:34 -0700"
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
      }
      if [user-agent] != "-" and [user-agent] != "" {
      useragent {
      add_tag => [ "UA" ]
      source => "user-agent"
      }
      }
      if "UA" in [tags] {
      if [device] == "Other" { mutate { remove_field => "device" } }
      if [name] == "Other" { mutate { remove_field => "name" } }
      if [os] == "Other" { mutate { remove_field => "os" } }
      }
      }
      }


      output {
      elasticsearch {
      host => "localhost"
      cluster => "LogCluster"
      node_name => "LogMaster"
      }
      }


      刪除
  10. 謝謝指導

    想再請教一下目前前輩所用主機的實體規格&記憶體的大小
    讓小弟做為日後參考
    感恩

    回覆刪除
  11. 想再請教redis緩衝會另存資料到硬碟
    造成空間不足

    請問該如何定時把資料備到磁帶
    對這部份不熟
    還請前輩能指導

    感恩

    回覆刪除
    回覆
    1. 抱歉我沒有備份過redis ,我都直接清掉
      不過你可以參考 http://redis.io/topics/persistence
      謝謝

      刪除
  12. 可否再請前輩分享redis的設定檔設定做為參考

    另外現在在HP DL380 G7 單台 把記憶體調到12G還是會當掉
    請教前輩目前是有分多台使用嗎
    可否提供硬體規格給我參考
    因為才剛接觸ELK,所以問的較多,還請前輩多多指教
    感恩

    回覆刪除
    回覆
    1. redis的設定檔我都寫在 http://zettadata.blogspot.tw/2014/09/redislog.html 中了。
      另外硬體規格的部分,我使用的其實是VM環境,有4 core + 8G RAM單台使用
      我還沒有時間試試多台的設定。
      請參考,謝謝

      刪除
  13. 再請教一下大大

    因為我不是寫程式的
    可否請教一下

    date {
    # Try to pull the timestamp from the 'timestamp' field (parsed above with
    # grok). The apache time format looks like: "18/Aug/2011:05:44:34 -0700"
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
    if [user-agent] != "-" and [user-agent] != "" {
    useragent {
    add_tag => [ "UA" ]
    source => "user-agent"
    }
    }
    if "UA" in [tags] {
    if [device] == "Other" { mutate { remove_field => "device" } }
    if [name] == "Other" { mutate { remove_field => "name" } }
    if [os] == "Other" { mutate { remove_field => "os" } }

    這段語法的意思&用意
    謝謝啦

    回覆刪除