1. 程式人生 > >ELASTICSEARCH、LOGSTASH、KIBANA 搭建高效率日誌管理系統

ELASTICSEARCH、LOGSTASH、KIBANA 搭建高效率日誌管理系統

ELK (ElasticSearch、LogStash以及Kibana)三者組合是一個非常強大的工具,這裡我們來實現監控日誌檔案並且收到日誌到ElasticSearch搜尋引擎,利用Kibana視覺化工具實現ElasticSearch查詢.

ElasticSearch

官方描述

Elasticsearch is a distributed, RESTful search and analytics engine capable of solving a growing number of use cases. As the heart of the Elastic Stack, it centrally stores your data so you can discover the expected and uncover the unexpected.

安裝

下載完成後解壓使用,解壓完成之後,檔案目錄如下:

├── bin
├── config
├── data
├── lib
├── LICENSE.txt
├── logs
├── modules
├── node-slaver-1
├── NOTICE.txt
├── plugins
└── README.textile

其中我們使用的命令位於bin目錄,配置檔案位於config目錄,建議將解壓好的檔案放在自己的home目錄下,防止出現許可權不足的錯誤問題.

配置

進入config目錄,其檔案列表如下

├── elasticsearch.keystore
├── elasticsearch.yml
├── jvm.options
├── log4j2.properties
├── role_mapping.yml
├── roles.yml
├── users
└── users_roles

我們重點關注 ElasticSerach配置檔案 elasticsearch.yml、JVM虛擬機器配置檔案 jvm.options以及日誌列印配置檔案log4j2.properties

從這些配置檔案我們也可以看出ElasticSearch和Java有莫大的關係,是的,ElasticSearch 是執行在Java虛擬機器上的系統。

elasticSearch.yml 配置檔案

此檔案中部大部分都是註釋我們主要關心的有以下內容:

  • node.name – 此節點的名稱(不配置的話會提供一個UUID的名稱)
  • path.logs – 日誌目錄,建議保持預設
  • http.port – ElasticSearch執行埠 預設9200

JVM 配置檔案

這裡我們主要配置下記憶體大小根據自己的硬體配置來調整ElasticSearch的記憶體大小(一般不需要修改,除非你的電腦配置很好,或者配置略低,需要修改這個記憶體引數)

  • Xms1g
  • Xmx1g

其他的引數暫時不需要修改

日誌配置

日誌配置一般不需要改動,你可以修改日誌的格式等資訊,可以參考Log4J的日誌格式命令來配置,這裡不做過多的說明.

測試

配置完成之後,進入bin目錄,來執行elasticSearch命令

./elasticsearch

看到start字樣,在瀏覽器或者終端訪問http://localhost:9200 (如果你修改了ElasticSearch的埠,這裡的9200改成你配置的埠號) 即可看到當前ElasticSearch節點的資訊,如下:

{
    "name": "node-master",
    "cluster_name": "cluster-dev",
    "cluster_uuid": "i1ti04HsQA6TK_ywrabGlA",
    "version": {
        "number": "6.4.1",
        "build_flavor": "default",
        "build_type": "tar",
        "build_hash": "e36acdb",
        "build_date": "2018-09-13T22:18:07.696808Z",
        "build_snapshot": false,
        "lucene_version": "7.4.0",
        "minimum_wire_compatibility_version": "5.6.0",
        "minimum_index_compatibility_version": "5.0.0"
    },
    "tagline": "You Know, for Search"
}

至於ElasticSearch的其他使用方法,請參考這篇文章:ElasticSearch常用命令

Kibana

Kibana lets you visualize your Elasticsearch data and navigate the Elastic Stack, so you can do anything from learning why you’re getting paged at 2:00 a.m. to understanding the impact rain might have on your quarterly numbers.

Kibana :ElasticSearch的視覺化工具,安裝Kibana很簡單,下載安裝包,解壓,配置,執行即可

安裝

解壓之後的目錄結構為

.
├── bin
├── config
├── data
├── LICENSE.txt
├── node
├── node_modules
├── NOTICE.txt
├── optimize
├── package.json
├── plugins
├── README.txt
├── src
├── webpackShims
└── yarn.lock

和ElasticSearch目錄結構類似,binconfig目錄是我們重點關注的

配置

開啟config目錄,編輯其中的唯一的一個檔案kibana.yml ,其中的幾個引數需要我們關注

  • server.port Kibana執行的埠 預設5601
  • elasticsearch.url ElasticSearch執行地址,預設是http://localhost:9200 如果在上面配置ElasticSearch中你修改了ElasticSearch的執行埠那麼,這裡也需要做相應的修改.
  • elasticsearch.username 如果你的ElasticSearch配置了使用者名稱,那麼這裡需要完善
  • elasticsearch.password 同上,這裡設定密碼

測試

回到Kibana的bin目錄下,執行./kibana即可,開啟瀏覽器訪問(http://localhost:5601)即可進入Kibana管理介面,這裡我們只要使用DevTools功能,其他的統計等功能,我們這裡暫時不做研究學習.

在DevTools命令中我們可以非常方便的使用ElasticSearch命令,並且可以高亮以及提示,非常的方便。

Kibana介面.png

LogStash

Logstash is an open source, server-side data processing pipeline that ingests data from a multitude of sources simultaneously, transforms it, and then sends it to your favorite “stash.” (Ours is Elasticsearch, naturally.)

安裝

然後解壓備用

配置

LogStash 內部有非常多的適配,包括Kafka、ElasticSearch、Redis、Nginx等等,輸入支援檔案、終端等,下面我們就模擬日誌檔案,然後利用Logstash收集轉換,規整到ElasticSearch中.

建立自定義日誌指令碼

首先我們先完成一個Shell指令碼,這個SHELL指令碼會每隔1S輸出時間寫入檔案內,如下:

rm /tmp/logstash.log
set index=2
while true
do
    cur_date="`date '+%Y %m %d %H %m %S'`" 
    echo ${cur_date} >> /tmp/logstash.log
    sleep 1
done

該指令碼會在/tmp目錄下建立logstash.log日誌檔案,並把資料寫入到該檔案中,Logstash需要監控這個檔案,並把這個檔案格式化.

建立啟動配置檔案

LogStash配置內容如下(檔名為conf.cnf 儲存在Logstash的目錄下):

  • input 表示資料輸入 這裡我們使用file監控檔案 path表示監控檔案目錄,支援匹配符,start_position表示監控的起始位置
  • filter 過濾處理 可以將過濾轉換我們的資料,也是比較複雜的一塊配置
  • output 輸出,這裡可以輸出到控制檯,ElasticSearch、Redis等系統,支援多輸出配置.
input{
  file{
    path => "/tmp/logstash.log"
    start_position => "end"
  }
}

filter {
    grok {
       match => { "message" => "%{YEAR:year} %{MONTHNUM:month} %{MONTHDAY:day} %{HOUR:hours} %{MINUTE:minute} %{SECOND:second}"}
    }

   json {
     source => "message"
     target => "jsoncontent"
   }
}

output{
  elasticsearch{
    hosts => ['127.0.0.1:9200']
    index => 'log'
  }
}

另外根據上面shell指令碼中的程式碼,各個時間屬性之間使用空格隔開,因此我們grok也需要根據是假的日誌情況適配。所以%{YEAR:year} %{MONTHNUM:month} %{MONTHDAY:day} %{HOUR:hours} %{MINUTE:minute} %{SECOND:second} 其中冒號前面的表示型別。冒號後面表示欄位屬性,在轉換的過程中會作為key來儲存到ElasticSearch中,當然這種型別是非常多的,官方支援的位置為:https://github.com/elastic/logstash

最後輸出,前期除錯我們可以輸出到控制檯中,配置如下:

output{
  stdout{
    codec => rubydebug
  }
}

輸出正確後我在寫入到ElasticSearch中即可

測試

首先我們先使用控制檯標準輸出,檢視效果

控制檯列印

修改conf.cnf檔案最後的output屬性為

output{
  stdout{
    codec => rubydebug
  }
}

切換到Logstash目錄下,輸入./bin/logstash -f ./conf.cnf 執行

Sending Logstash logs to /home/tao/soft/logstash/logs which is now configured via log4j2.properties
[2018-09-26T12:45:50,585][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2018-09-26T12:45:51,080][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"6.4.1"}
[2018-09-26T12:45:54,236][INFO ][logstash.pipeline        ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>8, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2018-09-26T12:45:54,739][INFO ][logstash.inputs.file     ] No sincedb_path set, generating one based on the "path" setting {:sincedb_path=>"/home/tao/soft/logstash/data/plugins/inputs/file/.sincedb_485b967e0d7e8bef0d95852573188f7a", :path=>["/tmp/logstash.log"]}
[2018-09-26T12:45:54,780][INFO ][logstash.pipeline        ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x5fa716fa run>"}
[2018-09-26T12:45:54,838][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2018-09-26T12:45:54,853][INFO ][filewatch.observingtail  ] START, creating Discoverer, Watch with file and sincedb collections
[2018-09-26T12:45:55,110][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}

這個時候因為檔案還沒有資料新增,所LogStash會時時監控該為見,我們呼叫Shell,向檔案中寫入資料,觀察結果(其中的警告資訊請忽略,是因為轉換過程中數字以0開頭,就會出現這個錯誤),另外注意要關閉這個shell指令碼(Ctrl+C),防止干擾我們資料

[2018-09-26T12:47:55,748][WARN ][logstash.filters.json    ] Error parsing json {:source=>"message", :raw=>"2018 09 26 12 09 55", :exception=>#<LogStash::Json::ParserError: Invalid numeric value: Leading zeroes not allowed
 at [Source: (byte[])"2018 09 26 12 09 55"; line: 1, column: 7]>}
{
          "host" => "linux",
      "@version" => "1",
       "message" => "2018 09 26 12 09 55",
          "year" => "2018",
    "@timestamp" => 2018-09-26T04:47:55.646Z,
         "month" => "09",
        "second" => "55",
         "hours" => "12",
          "path" => "/tmp/logstash.log",
        "minute" => "09",
          "tags" => [
        [0] "_jsonparsefailure"
    ],
           "day" => "26"
}
[2018-09-26T12:47:56,762][WARN ][logstash.filters.json    ] Error parsing json {:source=>"message", :raw=>"2018 09 26 12 09 56", :exception=>#<LogStash::Json::ParserError: Invalid numeric value: Leading zeroes not allowed
 at [Source: (byte[])"2018 09 26 12 09 56"; line: 1, column: 7]>}
{
          "host" => "linux",
      "@version" => "1",
       "message" => "2018 09 26 12 09 56",
          "year" => "2018",
    "@timestamp" => 2018-09-26T04:47:56.656Z,
         "month" => "09",
        "second" => "56",
         "hours" => "12",
          "path" => "/tmp/logstash.log",
        "minute" => "09",
          "tags" => [
        [0] "_jsonparsefailure"
    ],
           "day" => "26"
}

可以看到資料已經轉換成json型別,其中year,month。day以及hours正是我們在gork中配置的

輸入到ElasticSearch

修改最後的輸出

output{
  elasticsearch{
    hosts => ['127.0.0.1:9200']
    index => 'log'
  }
}

此時ElasticSearch應該啟動在9200埠,如果是其他埠,需要做相應的修改

和上述的命令一樣,./bin/logstash -f ./conf.cnf 執行,並且執行Shell指令碼,此時通過Kibana查詢資料 GET /log/doc/_search 就可以看到我們源源不斷向ElasticSearch寫入的日誌記錄了.