解释 logstash 过滤器中 Keen.io JSON 文件的位置
Interpret locations from Keen.io JSON file in logstash filter
我正在尝试使用 logstash 将来自 Keen.io 的 JSON 文件解析到 elasticsearch 中。位置和时间戳存储在这样的参数中:
{
"result":
[
{
"keen":
{
"timestamp": "2014-12-02T12:23:51.000Z",
"created_at": "2014-12-01T23:25:31.396Z",
"id": "XXXX",
"location":
{
"coordinates": [-95.8, 36.1]
}
}
}
]
}
我的过滤器目前看起来像这样:
input {
file {
path => ["test.json"]
start_position => beginning
type => json
}
}
filter {
json {
source => message
remove_field => message
}
}
output {
stdout { codec => rubydebug }
}
如何解析 "timestamp" 和 "location" 字段,以便将它们用于 Elasticsearch 中的 @timestamp 和 @geoip.coordinates?
更新:
我已经尝试过这种变化但没有运气。该文档非常基础 - 我是否误解了如何引用 JSON 字段?有没有办法添加调试输出来提供帮助?我尝试了 How to debug the logstash file plugin and Print a string to stdout using Logstash 1.4? 但都不起作用。
filter {
json {
source => message
remove_field => message
}
if ("[result][0][keen][created_at]") {
date {
add_field => [ "[timestamp]", "[result][0][keen][created_at]" ]
remove_field => "[result][0][keen][created_at]"
}
}
更新 2:
日期正在处理,仍然需要让位置正常工作。
filter {
json {
source => message
remove_field => message
add_tag => ["valid_json"]
}
if ("valid_json") {
if ("[result][0][keen][created_at]") {
date {
match => [ "[result][0][keen][created_at]", "ISO8601" ]
}
}
}
}
Keen.io 的 "created_at" 字段存储在 ISO 8601 format 中,因此可以很容易地被日期过滤器解析。 Lat/long 可以通过将 Keen.io 的现有坐标复制到 logstash 的 geoip.coordinates 数组中来设置坐标。
input {
file {
path => ["data.json"]
start_position => beginning
type => json
}
}
filter {
json {
source => message
remove_field => message
add_tag => ["valid_json"]
}
if ("valid_json") {
if ("[result][0][keen][created_at]") {
date {
# Set @timestamp to Keen.io's "created_at" field
match => [ "[result][0][keen][created_at]", "ISO8601" ]
}
}
if ("[result][0][keen][location][coordinates]") {
mutate {
# Copy existing co-orndiates into geoip.coordinates array
add_field => [ "[geoip][coordinates]", "%{[result][0][keen][location][coordinates][0]}" ]
add_field => [ "[geoip][coordinates]", "%{[result][0][keen][location][coordinates][1]}" ]
remove_field => "[result][0][keen][location][coordinates]"
}
}
}
}
output {
stdout { codec => rubydebug }
}
我正在尝试使用 logstash 将来自 Keen.io 的 JSON 文件解析到 elasticsearch 中。位置和时间戳存储在这样的参数中:
{
"result":
[
{
"keen":
{
"timestamp": "2014-12-02T12:23:51.000Z",
"created_at": "2014-12-01T23:25:31.396Z",
"id": "XXXX",
"location":
{
"coordinates": [-95.8, 36.1]
}
}
}
]
}
我的过滤器目前看起来像这样:
input {
file {
path => ["test.json"]
start_position => beginning
type => json
}
}
filter {
json {
source => message
remove_field => message
}
}
output {
stdout { codec => rubydebug }
}
如何解析 "timestamp" 和 "location" 字段,以便将它们用于 Elasticsearch 中的 @timestamp 和 @geoip.coordinates?
更新: 我已经尝试过这种变化但没有运气。该文档非常基础 - 我是否误解了如何引用 JSON 字段?有没有办法添加调试输出来提供帮助?我尝试了 How to debug the logstash file plugin and Print a string to stdout using Logstash 1.4? 但都不起作用。
filter {
json {
source => message
remove_field => message
}
if ("[result][0][keen][created_at]") {
date {
add_field => [ "[timestamp]", "[result][0][keen][created_at]" ]
remove_field => "[result][0][keen][created_at]"
}
}
更新 2:
日期正在处理,仍然需要让位置正常工作。
filter {
json {
source => message
remove_field => message
add_tag => ["valid_json"]
}
if ("valid_json") {
if ("[result][0][keen][created_at]") {
date {
match => [ "[result][0][keen][created_at]", "ISO8601" ]
}
}
}
}
Keen.io 的 "created_at" 字段存储在 ISO 8601 format 中,因此可以很容易地被日期过滤器解析。 Lat/long 可以通过将 Keen.io 的现有坐标复制到 logstash 的 geoip.coordinates 数组中来设置坐标。
input {
file {
path => ["data.json"]
start_position => beginning
type => json
}
}
filter {
json {
source => message
remove_field => message
add_tag => ["valid_json"]
}
if ("valid_json") {
if ("[result][0][keen][created_at]") {
date {
# Set @timestamp to Keen.io's "created_at" field
match => [ "[result][0][keen][created_at]", "ISO8601" ]
}
}
if ("[result][0][keen][location][coordinates]") {
mutate {
# Copy existing co-orndiates into geoip.coordinates array
add_field => [ "[geoip][coordinates]", "%{[result][0][keen][location][coordinates][0]}" ]
add_field => [ "[geoip][coordinates]", "%{[result][0][keen][location][coordinates][1]}" ]
remove_field => "[result][0][keen][location][coordinates]"
}
}
}
}
output {
stdout { codec => rubydebug }
}