ELK Stack已成功设置。
使用grokdebug.herokuapp.com
我的gork模式也有效并被转移到ElasticSearch
filter {
if [type] == "some_log" {
grok {
match => { "message" => '%{WORD:word_1} %{TIME:time_1} %{DATE:date_1} %{NUMBER:number_1}'
}
overwrite => "message"
}
}
}
这个输入的grok解析是完全正确的。
,输出
output {
elasticsearch {
protocol => "http"
}
}
问题是所有转储变量都是字符串类型。
如何让他们在ElasticSearch(正确的映射类型)中登录他们各自的类型
time_1,date_1和number_1都具有类型
的相同类型"time_1":{
"type":"string",
"norms":{
"enabled":false
},
"fields":{
"raw":{
"type":"string",
"index":"not_analyzed",
"ignore_above":256
}
}
}
我希望date_1被编入索引作为日期类型,number_1将被编入索引作为弹性搜索中的数字类型。
PS:有可能吗?从Logstash确定Elasticsearch的类型。
OR - 如何将具有适当类型的字段发送到ElasticSearch。
由于
答案 0 :(得分:1)
在您的grok模式中,使用%{PATTERN:field:datatype}
形式将捕获的字段转换为字符串以外的字段。有效的数据类型是" int"和"浮动"。在您的情况下,例如,例如使用%{NUMBER:number_1:int}
将number_1字段转换为整数。
请参阅Grok Basics下的grok filter documentation。
另一种选择是使用mutate filter转换现有字段的类型:
mutate {
convert => ["name-of-field", "integer"]
}
相关:
答案 1 :(得分:0)
您可以尝试使用ruby
插件转换所有字段。
在此示例中,我们将time_1
和date_1
组合在一起,并将其转换为Date
格式。
input {
stdin{}
}
filter {
grok {
match => [ "message" , "%{WORD:word_1} %{TIME:time_1} %{DATE:date_1} %{NUMBER:number_1}"]
overwrite => "message"
}
ruby {
code => "
datetime = event['time_1'] + ' ' + event['date_1']
event['datetime'] = Time.strptime(datetime,'%H:%M:%S %d-%m-%Y')
event['number_1'] = event['number_1'].to_i
"
}
}
output {
stdout { codec => rubydebug }
}
如果你有另一种需要转换的类型,你可以尝试找到ruby api来转换它们。希望这可以帮到你。