elasticsearch Logstash-只解析一个JSON事件
我正在使用ELK 5.3.0。我试图解析简单的JSON文档。它确实可以创建键/值,但是它在Elasticsearch中只写入一个事件。这是随机的。有时是第一,有时是第二或第三。但这始终是一件事 文件设置(在Mac中创建。每个JSON对象一行),三个事件: {“时间戳”:“2012-01-01 02:00:01”,“严重性”:“错误”, “消息”:“Foo失败”,“fieldone”:“我是第一个条目…如果值 对于字段1,“字段2”:“如果字段2的值为”} {“时间戳”:“2013-01-01 02:04:02”,“严重性”:“信息”,“消息”:“栏” “成功”,“现场一号”:“我是第二个条目…如果 字段1”,“字段2”:“如果字段2的值为”} {“时间戳”:“2017-01-01 02:10:12”,“严重性”:“调试”, “消息”:“Baz已收到通知”,“fieldone”:“我是第三个条目……如果 字段1的值,“字段2”:“如果字段2的值为”} Filebeatsetup:
elasticsearch Logstash-只解析一个JSON事件,
elasticsearch,logstash,elastic-stack,filebeat,
elasticsearch,Logstash,Elastic Stack,Filebeat,我正在使用ELK 5.3.0。我试图解析简单的JSON文档。它确实可以创建键/值,但是它在Elasticsearch中只写入一个事件。这是随机的。有时是第一,有时是第二或第三。但这始终是一件事 文件设置(在Mac中创建。每个JSON对象一行),三个事件: {“时间戳”:“2012-01-01 02:00:01”,“严重性”:“错误”, “消息”:“Foo失败”,“fieldone”:“我是第一个条目…如果值 对于字段1,“字段2”:“如果字段2的值为”} {“时间戳”:“2013-01-01 0
- input_type: log
paths: Downloads/elk/small/jsontest.log
document_type: jsonindex
filter {
if [@metadata][type] == "jsonindex" {
json {
source => "message"
}
}
}
{
"severity" => "DEBUG",
"offset" => 544,
"@uuid" => "a316bb67-98e5-4551-8243-f8538023cfd9",
"input_type" => "log",
"source" => "/Users/xxx/Downloads/elk/small/jsontest.log",
"fieldone" => "this if the value of a field one",
"type" => "jsonindex",
"tags" => [
[0] "beats_input_codec_json_applied",
[1] "_dateparsefailure"
],
"fieldtwo" => "this if the value of a field two",
"@timestamp" => 2017-05-08T11:25:41.586Z,
"@version" => "1",
"beat" => {
"hostname" => "C700893",
"name" => "C700893",
"version" => "5.3.0"
},
"host" => "C700893",
"fingerprint" => "bcb57f445084cc0e474366bf892f6b4ab9162a4e",
"messages" => "Baz was notified",
"timestamp" => "2017-01-01 02:10:12"
}
{
"severity" => "INFO",
"offset" => 361,
"@uuid" => "6d4b4401-a440-4894-b0de-84c97fc4eaf5",
"input_type" => "log",
"source" => "/Users/xxx/Downloads/elk/small/jsontest.log",
"fieldone" => "this if the value of a field one",
"type" => "jsonindex",
"tags" => [
[0] "beats_input_codec_json_applied",
[1] "_dateparsefailure"
],
"fieldtwo" => "this if the value of a field two",
"@timestamp" => 2017-05-08T11:25:41.586Z,
"@version" => "1",
"beat" => {
"hostname" => "C700893",
"name" => "C700893",
"version" => "5.3.0"
},
"host" => "C700893",
"fingerprint" => "bcb57f445084cc0e474366bf892f6b4ab9162a4e",
"messages" => "Bar was successful",
"timestamp" => "2013-01-01 02:04:02"
}
{
"severity" => "ERROR",
"offset" => 177,
"@uuid" => "d9bd0a0b-0021-48fd-8d9e-d6f82cd1e506",
"input_type" => "log",
"source" => "/Users/xxx/Downloads/elk/small/jsontest.log",
"fieldone" => "this if the value of a field one",
"type" => "jsonindex",
"tags" => [
[0] "beats_input_codec_json_applied",
[1] "_dateparsefailure"
],
"fieldtwo" => "this if the value of a field two",
"@timestamp" => 2017-05-08T11:25:41.586Z,
"@version" => "1",
"beat" => {
"hostname" => "C700893",
"name" => "C700893",
"version" => "5.3.0"
},
"host" => "C700893",
"fingerprint" => "bcb57f445084cc0e474366bf892f6b4ab9162a4e",
"messages" => "Foo failed",
"timestamp" => "2012-01-01 02:00:01"
}
Logstashsetup:
- input_type: log
paths: Downloads/elk/small/jsontest.log
document_type: jsonindex
filter {
if [@metadata][type] == "jsonindex" {
json {
source => "message"
}
}
}
{
"severity" => "DEBUG",
"offset" => 544,
"@uuid" => "a316bb67-98e5-4551-8243-f8538023cfd9",
"input_type" => "log",
"source" => "/Users/xxx/Downloads/elk/small/jsontest.log",
"fieldone" => "this if the value of a field one",
"type" => "jsonindex",
"tags" => [
[0] "beats_input_codec_json_applied",
[1] "_dateparsefailure"
],
"fieldtwo" => "this if the value of a field two",
"@timestamp" => 2017-05-08T11:25:41.586Z,
"@version" => "1",
"beat" => {
"hostname" => "C700893",
"name" => "C700893",
"version" => "5.3.0"
},
"host" => "C700893",
"fingerprint" => "bcb57f445084cc0e474366bf892f6b4ab9162a4e",
"messages" => "Baz was notified",
"timestamp" => "2017-01-01 02:10:12"
}
{
"severity" => "INFO",
"offset" => 361,
"@uuid" => "6d4b4401-a440-4894-b0de-84c97fc4eaf5",
"input_type" => "log",
"source" => "/Users/xxx/Downloads/elk/small/jsontest.log",
"fieldone" => "this if the value of a field one",
"type" => "jsonindex",
"tags" => [
[0] "beats_input_codec_json_applied",
[1] "_dateparsefailure"
],
"fieldtwo" => "this if the value of a field two",
"@timestamp" => 2017-05-08T11:25:41.586Z,
"@version" => "1",
"beat" => {
"hostname" => "C700893",
"name" => "C700893",
"version" => "5.3.0"
},
"host" => "C700893",
"fingerprint" => "bcb57f445084cc0e474366bf892f6b4ab9162a4e",
"messages" => "Bar was successful",
"timestamp" => "2013-01-01 02:04:02"
}
{
"severity" => "ERROR",
"offset" => 177,
"@uuid" => "d9bd0a0b-0021-48fd-8d9e-d6f82cd1e506",
"input_type" => "log",
"source" => "/Users/xxx/Downloads/elk/small/jsontest.log",
"fieldone" => "this if the value of a field one",
"type" => "jsonindex",
"tags" => [
[0] "beats_input_codec_json_applied",
[1] "_dateparsefailure"
],
"fieldtwo" => "this if the value of a field two",
"@timestamp" => 2017-05-08T11:25:41.586Z,
"@version" => "1",
"beat" => {
"hostname" => "C700893",
"name" => "C700893",
"version" => "5.3.0"
},
"host" => "C700893",
"fingerprint" => "bcb57f445084cc0e474366bf892f6b4ab9162a4e",
"messages" => "Foo failed",
"timestamp" => "2012-01-01 02:00:01"
}
日志存储输出(显示三个事件):
- input_type: log
paths: Downloads/elk/small/jsontest.log
document_type: jsonindex
filter {
if [@metadata][type] == "jsonindex" {
json {
source => "message"
}
}
}
{
"severity" => "DEBUG",
"offset" => 544,
"@uuid" => "a316bb67-98e5-4551-8243-f8538023cfd9",
"input_type" => "log",
"source" => "/Users/xxx/Downloads/elk/small/jsontest.log",
"fieldone" => "this if the value of a field one",
"type" => "jsonindex",
"tags" => [
[0] "beats_input_codec_json_applied",
[1] "_dateparsefailure"
],
"fieldtwo" => "this if the value of a field two",
"@timestamp" => 2017-05-08T11:25:41.586Z,
"@version" => "1",
"beat" => {
"hostname" => "C700893",
"name" => "C700893",
"version" => "5.3.0"
},
"host" => "C700893",
"fingerprint" => "bcb57f445084cc0e474366bf892f6b4ab9162a4e",
"messages" => "Baz was notified",
"timestamp" => "2017-01-01 02:10:12"
}
{
"severity" => "INFO",
"offset" => 361,
"@uuid" => "6d4b4401-a440-4894-b0de-84c97fc4eaf5",
"input_type" => "log",
"source" => "/Users/xxx/Downloads/elk/small/jsontest.log",
"fieldone" => "this if the value of a field one",
"type" => "jsonindex",
"tags" => [
[0] "beats_input_codec_json_applied",
[1] "_dateparsefailure"
],
"fieldtwo" => "this if the value of a field two",
"@timestamp" => 2017-05-08T11:25:41.586Z,
"@version" => "1",
"beat" => {
"hostname" => "C700893",
"name" => "C700893",
"version" => "5.3.0"
},
"host" => "C700893",
"fingerprint" => "bcb57f445084cc0e474366bf892f6b4ab9162a4e",
"messages" => "Bar was successful",
"timestamp" => "2013-01-01 02:04:02"
}
{
"severity" => "ERROR",
"offset" => 177,
"@uuid" => "d9bd0a0b-0021-48fd-8d9e-d6f82cd1e506",
"input_type" => "log",
"source" => "/Users/xxx/Downloads/elk/small/jsontest.log",
"fieldone" => "this if the value of a field one",
"type" => "jsonindex",
"tags" => [
[0] "beats_input_codec_json_applied",
[1] "_dateparsefailure"
],
"fieldtwo" => "this if the value of a field two",
"@timestamp" => 2017-05-08T11:25:41.586Z,
"@version" => "1",
"beat" => {
"hostname" => "C700893",
"name" => "C700893",
"version" => "5.3.0"
},
"host" => "C700893",
"fingerprint" => "bcb57f445084cc0e474366bf892f6b4ab9162a4e",
"messages" => "Foo failed",
"timestamp" => "2012-01-01 02:00:01"
}
ElasticSearch(以JSON格式查看文档):
没有JSON失败_应为dateparsefailure
这是怎么回事
编辑(解决方案):
过了一段时间,我想我是在射自己的腿。由于我正在解析许多不同的日志以及日志类型,我需要确保没有重复的日志,在我的日志存储输出部分,我有一段代码来确保没有重复的日志实体:
uuid {
target => "@uuid"
overwrite => true
}
fingerprint {
source => ["message"]
target => "fingerprint"
key => "78787878"
method => "SHA1"
concatenate_sources => true
}
}
在我称之为ElasticSearch的同一节结束,如下所示:
if [@metadata][type] == "jsonindex" {
elasticsearch {
hosts => [ "localhost:9200" ]
index => "%{[@metadata][type]}"
document_id => "%{fingerprint}"
}
}
由于我的JSON对象不包含message属性,因此它始终几乎相同:
fingerprint {
source => ["message"]
创建小规模的“编辑到索引”修复了该问题:
if [@metadata][type] == "jsonindex" {
elasticsearch {
hosts => [ "localhost:9200" ]
index => "%{[@metadata][type]}"
}
}
您的数据需要按行分隔
grok需要将其解析为不同的行,它将成为3个数据
例如:
{"timestamp":"2012-01-01 02:00:01", "severity":"ERROR", "messages":"Foo failed", "fieldone": "I am first entry... if the value of a field one", "fieldtwo": "ttthis if the value of a field two"}
{"timestamp":"2013-01-01 02:04:02", "severity":"INFO", "messages":"Bar was successful", "fieldone": "I am second entry... if the value of a field one", "fieldtwo": "this if the value of a field two"}
{"timestamp":"2017-01-01 02:10:12", "severity":"DEBUG", "messages":"Baz was notified", "fieldone": "I am third entry... if the value of a field one", "fieldtwo": "this if the value of a field two"}
您在一行中,因此结果是解析最后一行,这意味着时间戳是最后一行
“时间戳”:“2017-01-01 02:10:12
如果你换线,我想可能不会,但你可以用这个
- input_type: log
paths: Downloads/elk/small/jsontest.log
document_type: jsonindex
multiline.pattern: '^{"timestamp":"[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}, '
multiline.negate: true
multiline.match: after
添加要更改的多行,但恐怕您的数据没有按行分隔
您的数据需要按行分隔
grok需要将其解析为不同的行,它将成为3个数据
例如:
{"timestamp":"2012-01-01 02:00:01", "severity":"ERROR", "messages":"Foo failed", "fieldone": "I am first entry... if the value of a field one", "fieldtwo": "ttthis if the value of a field two"}
{"timestamp":"2013-01-01 02:04:02", "severity":"INFO", "messages":"Bar was successful", "fieldone": "I am second entry... if the value of a field one", "fieldtwo": "this if the value of a field two"}
{"timestamp":"2017-01-01 02:10:12", "severity":"DEBUG", "messages":"Baz was notified", "fieldone": "I am third entry... if the value of a field one", "fieldtwo": "this if the value of a field two"}
您在一行中,因此结果是解析最后一行,这意味着时间戳是最后一行
“时间戳”:“2017-01-01 02:10:12
如果你换线,我想可能不会,但你可以用这个
- input_type: log
paths: Downloads/elk/small/jsontest.log
document_type: jsonindex
multiline.pattern: '^{"timestamp":"[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}, '
multiline.negate: true
multiline.match: after
添加要更改的多行,但我担心您的数据在文件中没有按行分隔,它被分隔为新行。您可以检查filebeat多行设置以允许事件按行更改答案谢谢Joseph,但我发现了问题。我将编辑我的问题。在文件中,它被分隔为一个新行。您可以检查filebeat MultiLine设置以允许事件按行进行我已更改答案谢谢Joseph,但我发现了问题。我将编辑我的问题。