私はこのようなログを持っています:
{"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\":\"エラー\ "}"、
これを解決するのを手伝ってください。
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を解析する方法を示しています。
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
私はあなたが抱えているまったく同じ問題についてインターネットを精査し、上記のものを含むさまざまな提案を試みました。しかし、何も役に立たなかったので、昔ながらのやり方でやった。 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です。