web-dev-qa-db-ja.com

filebeat、logstash、およびelasticsearchを使用してjson形式のログをkibanaに送信しますか?

私はこのようなログを持っています:

{"logId":"57aaf6c8d32fb","clientIp":"127.0.0.1","time":"03:11:29 pm","uniqueSubId":"57aaf6c98963b","channelName":"JSPC","apiVersion":"v1","modulName":null,"actionName":"apiRequest","typeOfError":"","statusCode":"","message":"In Auth","exception":"In Auth","logType":"Info"}

{"logId":"57aaf6c8d32fb","clientIp":"127.0.0.1","time":"03:11:29 pm","uniqueSubId":"57aaf6c987206","channelName":"JSPC","apiVersion":"v2","modulName":null,"actionName":"performV2","typeOfError":"","statusCode":"","message":"in inbox api v2 5","exception":"in inbox api v2 5","logType":"Info"}

それらをkibanaにプッシュしたい。次の構成を使用して、filebeatを使用してデータをlogstashに送信しています。

filebeat.yml

 ### Logstash as output
logstash:
# The Logstash hosts
hosts: ["localhost:5044"]

# Number of workers per Logstash Host.
#worker: 1

次の設定を使用して、コーデックタイプを変更します。

input {

     beats {
     port => 5000
     tags => "beats"
     codec => "json_lines"
     #ssl  => true
     #ssl_certificate => "/opt/filebeats/logs.example.com.crt"
     #ssl_key => "/opt/filebeats/logs.example.com.key"
     }


     syslog {
        type => "syslog"
        port => "5514"

    }

}

しかし、それでも文字列形式でログを取得します。

"メッセージ": "{\" logId\":\" 57aaf6c96224b\"、\" clientIp\":\" 127.0.0.1\"、\" time\":\" 03:11:29 pm\"、\ "channelName \":\ "JSPC \"、\ "apiVersion \":null、\ "modulName \":null、\ "actionName \":\ "404 \"、\ "typeOfError \":\ "EXCEPTION \" 、\ "statusCode \":0、\ "message \":\ "404ページが発生しましたhttp:\/\/localjs.com \/uploads \/NonScreenedImages \/profilePic120 \/16 \/29 \/15997002iicee52ad041fed55e952d4e4e163d5972ii4c41f88451054egd0e330cc184eg29ebe330cc184eg29ebe330ccd9e0e "、\" logType\":\"エラー\ "}"、

これを解決するのを手伝ってください。

7
learner

Filebeatから送信されたLogstashのJSONログ行を解析するには、コーデックの代わりに json filter を使用する必要があります。これは、FilebeatがデータをJSONとして送信し、ログ行の内容がmessageフィールドに含まれているためです。

Logstash構成:

input {
  beats {
    port => 5044
  }   
}   

filter {
  if [tags][json] {
    json {
      source => "message"
    }   
  }   
}   

output {
  stdout { codec => rubydebug { metadata => true } } 
}

Filebeatの設定:

filebeat:
  prospectors:
    - paths:
        - my_json.log
      fields_under_root: true
      fields:
        tags: ['json']
output:
  logstash:
    hosts: ['localhost:5044']

Filebeatの設定で、jsonフィルターをデータに条件付きで適用できるように、イベントに「json」タグを追加しました。

Filebeat 5.0は、Logstashを使用せずにJSONを解析できますが、現時点ではまだアルファリリースです。 Filebeatを使用した構造化ロギング というタイトルのこのブログ投稿は、Filebeat 5.0でJSONを解析する方法を示しています。

8
A J

FileBeat 5.x以降Logstashを使用せずに実行できます。

Filebeatの設定:

filebeat.prospectors:
- input_type: log
  paths: ["YOUR_LOG_FILE_DIR/*"]
  json.message_key: logId
  json.keys_under_root: true

output.elasticsearch:
  hosts: ["<HOSTNAME:PORT>"]
  template.name: filebeat
  template.path: filebeat.template.json

FilebeatはLogstashよりも軽量です。また、elasticsearchバージョン2.xに挿入する必要がある場合でも、FileBeat 5.xのこの機能を使用できます。実際の例は次のとおりです here

3
Netanel Malka

私はあなたが抱えているまったく同じ問題についてインターネットを精査し、上記のものを含むさまざまな提案を試みました。しかし、何も役に立たなかったので、昔ながらのやり方でやった。 elasticsearchのドキュメントに行きました filebeatの設定について

そして、それがすべて必要でした(logstashでフィルター構成の必要はありません)

Filebeatの設定:

filebeat.prospectors:
- input_type: log
  document_type: #whatever your type is, this is optional
  json.keys_under_root: true
  paths:
    - #your path goes here

keys_under_root

ネストされたjsonキーを出力ドキュメントのトップレベルにコピーします。

私のfilebeatのバージョンは5.2.2です。

2
gaukhar