から値を割り当てることができないLogstash:以下の入力が与えられるとJSON
111.111.111.111、11.11.11.11 - 11.11.11.11 [06 /月/ 2016:08:26:10 +0000]「POST /幾分サービス/ GetSomething HTTP/1.1" 499 0 " - " "ジャカルタコモンズ-のHttpClient/3.1" "7979798797979799" 59.370 - "{\ X0A \ x22correlationId \ X22:\ x22TestCorr1 \ X22 \ X0A}" Logstash構成で
。
:input { stdin {} }
output { stdout { codec => "rubydebug" } }
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG} %{QS:partner_id} %{NUMBER:req_time} %{GREEDYDATA:extra_fields}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
mutate {
gsub => ["extra_fields", "\\x0A","","extra_fields", "\\x22",'\"']
}
json {
source => "extra_fields"
target => "extra_fields_json"
}
mutate {
add_field => {
"correlationId" => "%{[extra_fields_json][correlationId]}"
}
}
}
は私たちに次のような出力を与えました
Logstash startup completed { "message" => "111.111.111.111, 11.11.11.11 - 11.11.11.11 [06/May/2016:08:26:10 +0000] "POST /some-service/GetSomething HTTP/1.1" 499 0 "-" "Jakarta Commons-HttpClient/3.1" "8888888" 59.370 - "{\x0A\x22correlationId\x22 : \x22TestCorr1\x22\x0A}", "@version" => "1", "@timestamp" => "2016-06-23T18:00:28.831Z", "clientip" => "11.11.11.11", "ident" => "-", "auth" => "10.0.12.205", "timestamp" => "06/May/2016:08:26:10 +0000", "verb" => "POST", "request" => "/some-service/GetSomething", "httpversion" => "1.1", "response" => "499", "bytes" => "0", "referrer" => "\"-\"", "agent" => "\"Jakarta Commons-HttpClient/3.1\"", "partner_id" => "\"8888888\"", "req_time" => [ [0] "59.370", [1] "1" ], "extra_fields" => "\"{\\\"correlationId\\\" : \\\"TestCorr_1\\\"}\"", "extra_fields_json" => "{\"correlationId\" : \"TestCorr_1\"}", "correlationId" => "correlationId" } Logstash shutdown completed
なぜ "correlationId"の値が "TestCorr_1 \"ではなく "correlationId"であるのですか?
あなたのお手伝いをお待ちしております。ありがとう!
アメージング動作しない/フィードバックを与えることを躊躇しないでください!ありがとう、私はこの問題を解決するために多くの時間を費やしてきました。ところでもう1つ質問がありますが、jsonが空の場合、テキストが表示されます。ソースにフィールドがない場合はどうすれば空白になりますか? "correlationId" => "%{[extra_fields_json] [correlationId]}"フィールドがソースに存在しない場合、 "correlationId" => "" – yanto
jsonフィルタの後に、このようにsthgを使用する必要があると思います。if([correlationId] == "%{[extra_fields_json] [correlationId]}"){...}にmutateフィルタとreplaceオプションcorrelationIdフィールド([doc](https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-replace)) – baudsp
こんにちは@yanto答えがあなたの質問を解決したことを受け入れることを検討してください。さらなる助けが必要な場合は、お気軽にコメント/新しい質問をしてください – baudsp