2017-10-10 73 views
0

我們在雲中有幾個外部應用程序(IBM Bluemix),它將應用程序syslog記錄在內部使用ELK堆棧的bluemix logmet服務中。批量上傳日誌消息到本地Elasticsearch

現在我們定期從雲端下載日誌並將其上傳到本地的Elastic/Kibana實例中。這是因爲如果我們想通過Kibana搜索相同的日誌,將日誌存儲在雲服務中會產生成本和額外的成本。本地彈性實例可以刪除/刷新我們不需要的舊日誌。

下載的日誌將這個樣子

{"instance_id_str":"0","source_id_str":"APP/PROC/WEB","app_name_str":"ABC","message":"Hello","type":"syslog","event_uuid":"474b78aa-6012-44f3-8692-09bd667c5822","origin_str":"rep","ALCH_TENANT_ID":"3213cd20-63cc-4592-b3ee-6a204769ce16","logmet_cluster":"topic3-elasticsearch_3","org_name_str":"123","@timestamp":"2017-09-29T02:30:15.598Z","message_type_str":"OUT","@version":"1","space_name_str":"prod","application_id_str":"3104b522-aba8-48e0-aef6-6291fc6f9250","ALCH_ACCOUNT_ID_str":"","org_id_str":"d728d5da-5346-4614-b092-e17be0f9b820","timestamp":"2017-09-29T02:30:15.598Z"} 

{"instance_id_str":"0","source_id_str":"APP/PROC/WEB","app_name_str":"ABC","message":"EFG","type":"syslog","event_uuid":"d902dddb-afb7-4f55-b472-211f1d370837","origin_str":"rep","ALCH_TENANT_ID":"3213cd20-63cc-4592-b3ee-6a204769ce16","logmet_cluster":"topic3-elasticsearch_3","org_name_str":"123","@timestamp":"2017-09-29T02:30:28.636Z","message_type_str":"OUT","@version":"1","space_name_str":"prod","application_id_str":"dcd9f975-3be3-4451-a9db-6bed1d906ae8","ALCH_ACCOUNT_ID_str":"","org_id_str":"d728d5da-5346-4614-b092-e17be0f9b820","timestamp":"2017-09-29T02:30:28.636Z"} 

我在我們當地elasticsearch創建一個索引作爲

curl -XPUT 'localhost:9200/commslog?pretty' -H 'Content-Type: application/json' -d' 
{ 
    "settings" : { 
     "number_of_shards" : 1 
    }, 
    "mappings" : { 
     "logs" : { 
      "properties" : { 
       "instance_id_str" : { "type" : "text" }, 
       "source_id_str" : { "type" : "text" }, 
       "app_name_str" : { "type" : "text" }, 
       "message" : { "type" : "text" }, 
       "type" : { "type" : "text" }, 
       "event_uuid" : { "type" : "text" }, 
       "ALCH_TENANT_ID" : { "type" : "text" }, 
       "logmet_cluster" : { "type" : "text" }, 
       "org_name_str" : { "type" : "text" }, 
       "@timestamp" : { "type" : "date" }, 
       "message_type_str" : { "type" : "text" }, 
       "@version" : { "type" : "text" }, 
       "space_name_str" : { "type" : "text" }, 
       "application_id_str" : { "type" : "text" }, 
       "ALCH_ACCOUNT_ID_str" : { "type" : "text" }, 
       "org_id_str" : { "type" : "text" }, 
       "timestamp" : { "type" : "date" } 
      } 
     } 
    } 
}' 

我們批量上傳的文件,使用的命令

curl -XPOST -H 'Content-Type: application/x-ndjson' http://localhost:9200/commslog/logs/_bulk --data-binary '@commslogs.json' 

上述命令會引發錯誤

格式錯誤的動作/元數據線[1],預期START_OBJECT或END_OBJECT但發現[VALUE_STRING]

的解決方案是遵循大量上載的規則按

https://discuss.elastic.co/t/bulk-insert-file-having-many-json-entries-into-elasticsearch/46470/2

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html

所以我通過在每行之前加入動作手動更改了幾條日誌語句

{ "index" : { "_index" : "commslog", "_type" : "logs" } } 

這個作品!!

另一種選擇是要求curl命令,提供_idex和_type路徑

curl -XPOST -H 'Content-Type: application/x-ndjson' http://localhost:9200/commslog/logs/_bulk --data-binary '@commslogs.json' 

,但沒有行動,這也引發了同樣的錯誤

問題是,我們不能這樣做爲我們得到的數千條日誌記錄。是否有一種選擇,即我們從Bluemix下載日誌文件並上傳文件而不添加操作。

注意我們不使用logstash的那一刻,但

  • 是有可能使用logstash,只需使用神交改造 日誌,並添加必要的條目?
  • 我們如何通過Logstash批量上傳文件?

  • 是logstash理想的解決方案,或者我們可以只編寫一個程序來 改造和做

感謝

+1

Filebeat應該能夠將json日誌直接寫入您的本地elasticsearch。 –

+0

謝謝@AlainCollins。我確實嘗試了Filebeats,並能夠將日誌直接上傳到ES中。 – Tatha

回答

1

正如@Alain柯林斯說,你應該能夠直接filebeat使用。

對於logstash:

  • 應該儘可能使用logstash,但不是使用神交,你應該使用JSON編解碼器/過濾器,這將是容易。
  • 您可以使用帶有logstash的文件輸入來處理許多文件並等待它完成(要知道它何時完成,使用文件/標準輸出,可能使用點編解碼器,並等待它停止寫入)。
  • 不要僅僅使用logstash轉換文件,您應該直接上傳到elasticsearch(使用elasticsearch輸出)。

至於你的問題,我認爲這將是很容易只使用一個小程序,添加缺少的行動路線或使用filebeat,除非你與logstash配置足夠的嘗試編寫和logstash配置比快程序在文檔的每個地方添加一行。

+0

感謝您提出多種解決方案。我嘗試了兩種選擇(小腳本和filebeats),並能夠用它上傳日誌。通過文件節拍,需要更多配置來支持相同的索引和類型,而不是使用filebeat的默認索引。我暫時決定使用腳本sed'h; s /.*/ {「index」:{「_index」:「commslog」,「_type」:「logs」}} /; G'logs .json在每行之前添加索引行。一旦我們計劃自動化這個過程,我們可以使用filebeats。謝謝 – Tatha

+0

@塔塔不客氣。雖然我同意可以使用logstash或filebeat,但我認爲使用簡單的解決方案會更好。 – baudsp