Как отобразить вложенный JSON в Log-stash HTTP Output
Я использую Logstash для вывода сообщения JSON в API. Я использую атрибут "mapping" для сопоставления моего сообщения. Смотрите следующий фрагмент моей конфигурации грузоотправителя.
output {
stdout { }
http {
url => "http://localhost:8087/messages"
http_method => "post"
format => "json"
mapping => ["MessageId","654656","TimeStamp","2001-12-31T12:00:00","CorrelationId","986565","MessageType","%{log_MessageType}" ,"MessageTitle","%{log_MessageTitle}","Message","%{log_Message}"]
}
}
Эта конфигурация работает нормально и выдает следующий вывод:
{
"MessageId": "654656",
"TimeStamp": "2001-12-31T12:00:00",
"CorrelationId": "986565",
"MessageType": "INFO",
"MessageTitle": "TestTittle",
"Message": "Sample Message"
}
Вход в журнал:
TID: [0] [ESB] [2016-05-30 23:02:02,602] INFO {org.wso2.carbon.registry.core.jdbc.EmbeddedRegistryService} - Configured Registry in 572ms {org.wso2.carbon.registry.core.jdbc.EmbeddedRegistryService}
Образец Грока:
TID:%{SPACE}\[%{INT:log_SourceSystemId}\]%{SPACE}\[%{DATA:log_ProcessName}\]%{SPACE}\[%{TIMESTAMP_ISO8601:log_TimeStamp}\]%{SPACE}%{LOGLEVEL:log_MessageType}%{SPACE}{%{JAVACLASS:log_MessageTitle}}%{SPACE}-%{SPACE}%{GREEDYDATA:log_Message}
Постановка задачи:
Я хочу следующий вывод через отображение HTTP. Я хотел, чтобы внутри моего сообщения был вложенный тип JSON, как мне добавить его в тег сопоставления.
Ожидаемый результат:
{
"MessageId": "654656",
"TimeStamp": "2001-12-31T12:00:00",
"CorrelationId": "986565",
"MessageType": "INFO",
"MessageTitle": "TestTittle",
"Message": "Sample Message",
"MessageDetail": {
"FieldA": "65656",
"FieldB": "192.168.1.1",
"FieldC": "sample value"
}
}
Я пробовал несколько вариантов, но я получаю ошибки.
1 ответ
Это невозможно сделать с помощью message
картирование в http
выход. Это отображение может создать только одноуровневый JSON.
Однако вы можете создать сообщение JSON до того, как оно достигнет http
вывод с использованием mutate/add_field
фильтр.
filter {
grok {
match => { "message" => "TID:%{SPACE}\[%{INT:SourceSystemId}\]%{SPACE}\[%{DATA:ProcessName}\]%{SPACE}\[%{TIMESTAMP_ISO8601:log_TimeStamp}\]%{SPACE}%{LOGLEVEL:log_MessageType}%{SPACE}{%{JAVACLASS:log_MessageTitle}}%{SPACE}-%{SPACE}%{GREEDYDATA:log_Message}" }
}
# add additional fields in your event here
mutate {
gsub => [
"log_TimeStamp", "\s", "T",
"log_TimeStamp", ",", "."
]
add_field => {
"MessageId" => "654656"
"TimeStamp" => "%{log_TimeStamp}"
"CorrelationId" => "986565"
"MessageType" => "%{log_MessageType}"
"MessageTitle" => "%{log_MessageTitle}"
"Message" => "%{log_Message}"
"[MessageDetail][FieldA]" => "65656"
"[MessageDetail][FieldB]" => "192.168.1.1"
"[MessageDetail][FieldC]" => "sample value"
}
remove_field => ["@version", "@timestamp", "host", "message", "SourceSystemId", "ProcessName", "log_TimeStamp", "log_MessageType", "log_MessageTitle", "log_Message"]
}
}
output {
stdout { codec => "rubydebug" }
http {
url => "http://localhost:8087/messages"
http_method => "post"
format => "json"
}
}
Вы получите именно тот код JSON, который вы ожидали, отправленный на конечную точку HTTP
{
"MessageId": "654656",
"TimeStamp": "2016-05-30T23:02:02.602",
"CorrelationId": "986565",
"MessageType": "INFO",
"MessageTitle": "org.wso2.carbon.registry.core.jdbc.EmbeddedRegistryService",
"Message": "Configured Registry in 572ms {org.wso2.carbon.registry.core.jdbc.EmbeddedRegistryService}",
"MessageDetail": {
"FieldA": "65656"
"FieldB": "192.168.1.1"
"FieldC": "sample value"
}
}