使用 Logstash 从文本文件中提取数据并导入到 Elasticsearch
Extracting data from text file and import to Elasticsearch using Logstash
我有一个文本文件需要导入到我的 Elasticsearch 中。我的文本文件格式是:
1 ARsv200711042 Allen Alane
2 ARsv200711042 Allen Arthur
3 ARsv200711042 Allen Bernice
4 ARsv200711042 Allen Betty
5 ARsv200711042 Allen Brittany
6 ARsv200711042 Allen Bruce
7 ARsv200711042 Allen Carolyn
8 ARsv200711042 Allen Carolyn
9 ARsv200711042 Allen Chadderick
10 ARsv200711042 Allen Darlene
我需要获取仓位数据;例如,第一列是eMID,从第1位到第13位,我的StateSource在14-15位,CodeProducts在16-17位,依此类推。
所以我将 Logstash 配置如下:
input {
file {
path => "D:/sample/sample 500.txt"
start_position => "beginning"
}
}
filter {
grok {
match => {
"message" => [
"(?<eMID>.{0,13})(?<StateSource>.{0,2})(?<CodeProducts>.{0,2})(?<AcquiredDate>.{0,8})(?<Uses>.{0,2})(?<Prefix>.{0,10})(?<LName>.{0,30})(?<FName>.{0,30})"
]
}
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "sample-data"
#user => "elastic"
#password => "changeme"
}
}
我能够成功导入数据。我有以下问题:
- 如何格式化日期字段,例如。我获取了
20071104
格式的日期,需要转换成日期格式,elasticsearch可以分析
- 由于我们正在建仓,因此可能会出现很多尾随空格,如何trim这些空格。
- 在某些情况下,例如,一些列。
Firstname/FName
或 Lastname/LName
可能包含特殊字符,例如 + - && || ! ( ) { } [ ] ^ " ~ * ? : \
等,我怎样才能将它们与正则表达式匹配并插入到 elasticsearch.
好的,所以一种方法是将 20071104
分成四个部分 \d{4}
并将其分配给 y,然后将接下来的两位数 \d{2}
分配给 m,剩下的两位数 \d{2}
到 d 并框出一个日期对象
或者第二种方法是从字符串创建一个日期并使用该对象重新格式化,就像我在这个例子中所做的那样,假设 AcquiredDate 是 20071104
filter {
ruby {
code => '
date = Date.strptime(event.get("AcquiredDate"), "%Y%m%d")
event.set("new_time", date.strftime("%Y-%m-%d"))
'
}
mutate {
remove_field =>
["host","@timestamp","sequence","message","@version"]
}
}
给你
{
"AcquiredDate" => "20071104",
"new_time" => "2007-11-04"
}
回答你的第二部分
使用类似这样的东西
mutate {
strip => ["field1withwhitespace", "field2withwhitespace"]
}
我有一个文本文件需要导入到我的 Elasticsearch 中。我的文本文件格式是:
1 ARsv200711042 Allen Alane
2 ARsv200711042 Allen Arthur
3 ARsv200711042 Allen Bernice
4 ARsv200711042 Allen Betty
5 ARsv200711042 Allen Brittany
6 ARsv200711042 Allen Bruce
7 ARsv200711042 Allen Carolyn
8 ARsv200711042 Allen Carolyn
9 ARsv200711042 Allen Chadderick
10 ARsv200711042 Allen Darlene
我需要获取仓位数据;例如,第一列是eMID,从第1位到第13位,我的StateSource在14-15位,CodeProducts在16-17位,依此类推。
所以我将 Logstash 配置如下:
input {
file {
path => "D:/sample/sample 500.txt"
start_position => "beginning"
}
}
filter {
grok {
match => {
"message" => [
"(?<eMID>.{0,13})(?<StateSource>.{0,2})(?<CodeProducts>.{0,2})(?<AcquiredDate>.{0,8})(?<Uses>.{0,2})(?<Prefix>.{0,10})(?<LName>.{0,30})(?<FName>.{0,30})"
]
}
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "sample-data"
#user => "elastic"
#password => "changeme"
}
}
我能够成功导入数据。我有以下问题:
- 如何格式化日期字段,例如。我获取了
20071104
格式的日期,需要转换成日期格式,elasticsearch可以分析 - 由于我们正在建仓,因此可能会出现很多尾随空格,如何trim这些空格。
- 在某些情况下,例如,一些列。
Firstname/FName
或Lastname/LName
可能包含特殊字符,例如+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
等,我怎样才能将它们与正则表达式匹配并插入到 elasticsearch.
好的,所以一种方法是将 20071104
分成四个部分 \d{4}
并将其分配给 y,然后将接下来的两位数 \d{2}
分配给 m,剩下的两位数 \d{2}
到 d 并框出一个日期对象
或者第二种方法是从字符串创建一个日期并使用该对象重新格式化,就像我在这个例子中所做的那样,假设 AcquiredDate 是 20071104
filter {
ruby {
code => '
date = Date.strptime(event.get("AcquiredDate"), "%Y%m%d")
event.set("new_time", date.strftime("%Y-%m-%d"))
'
}
mutate {
remove_field =>
["host","@timestamp","sequence","message","@version"]
}
}
给你
{
"AcquiredDate" => "20071104",
"new_time" => "2007-11-04"
}
回答你的第二部分
使用类似这样的东西
mutate {
strip => ["field1withwhitespace", "field2withwhitespace"]
}