解析带引号的字符串和日期时间偏移量 - GROK 和 Logstash
Parsing Quoted Strings and DateTime Offset - GROK and Logstash
使用 Grok Debuger 我正在尝试解析一些自定义数据:
1 1 "Device 1" 1 "Input 1" 0 "On" "Off" "2020-01-01T00:00:00.1124303+00:00"
到目前为止我有:
%{INT:id} %{INT:device} %{QUOTEDSTRING:device_name} %{INT:input}
%{QUOTEDSTRING:input_name} %{INT:state} %{QUOTEDSTRING:on_phrase}
%{QUOTEDSTRING:off_phrase} \"%{TIMESTAMP_ISO8601:when}\"
但是,我得到的是字符串 %{QUOTEDSTRING)
周围的双引号,以及带有时间和日期的两个小时和分钟 %{TIMESTAMP_ISO8601:when}
{
"id": [
[
"1"
]
],
"device": [
[
"1"
]
],
"device_name": [
[
""Device 1""
]
],
"input": [
[
"1"
]
],
"input_name": [
[
""Input 1""
]
],
"state": [
[
"0"
]
],
"on_phrase": [
[
""On""
]
],
"off_phrase": [
[
""Off""
]
],
"when": [
[
"2020-01-01T00:00:00.1124303+00:00"
]
],
"YEAR": [
[
"2020"
]
],
"MONTHNUM": [
[
"01"
]
],
"MONTHDAY": [
[
"01"
]
],
"HOUR": [
[
"00",
"00"
]
],
"MINUTE": [
[
"00",
"00"
]
],
"SECOND": [
[
"00.1124303"
]
],
"ISO8601_TIMEZONE": [
[
"+00:00"
]
]
}
此外,当涉及到 logstash.conf
时我有点卡住了,因为我不确定 index
应该放在 output
中什么。以下代码来自 github 的先前示例:
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
manage_template => false
index => "sample-%{+YYYY.MM.dd}"
}
}
我猜我的应该是这样的:
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{INT:id} %{INT:device} %{QUOTEDSTRING:device_name} %{INT:input} %{QUOTEDSTRING:input_name} %{INT:state} %{QUOTEDSTRING:on_phrase} %{QUOTEDSTRING:off_phrase} \"%{TIMESTAMP_ISO8601:when}\"" }
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
manage_template => false
index => "sample-%{????????}"
}
}
同样,我不清楚我应该用 "sample-%{????????}"
做什么
关于 double-double-quotes:只需使用 DATA 而不是 QUOTEDSTRING:
"%{DATA:device_name}"
小时和分钟中的重复条目来自时区:第一个条目是实际小时,第二个条目是时区的小时。会议记录也一样。
要摆脱它,您需要一个自定义模式:
"(?<when>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?(?<ISO8601_TIMEZONE>Z|[+-](?:2[0123]|[01]?[0-9])(?::?(?:[0-5][0-9])))?)"
(如果您对解析时间戳完全不感兴趣,只需再次使用 DATA)。
因此,您的模式可能如下所示:
%{INT:id} %{INT:device} "%{DATA:device_name}" %{INT:input} "%{DATA:input_name}" %{INT:state} "%{DATA:on_phrase}" "%{DATA:off_phrase}" "(?<when>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?(?<ISO8601_TIMEZONE>Z|[+-](?:2[0123]|[01]?[0-9])(?::?(?:[0-5][0-9])))?)"
关于指数:
- 你可以完全省略它然后使用默认的:
logstash-%{+YYYY.MM.dd}
- 如果你想每天都有单独的索引,你可以使用
sample-%{+YYYY.MM.dd}
- 您可以使用
sample-
只有一个索引
- 您可以在索引模式中使用任何其他字段组合
使用 Grok Debuger 我正在尝试解析一些自定义数据:
1 1 "Device 1" 1 "Input 1" 0 "On" "Off" "2020-01-01T00:00:00.1124303+00:00"
到目前为止我有:
%{INT:id} %{INT:device} %{QUOTEDSTRING:device_name} %{INT:input} %{QUOTEDSTRING:input_name} %{INT:state} %{QUOTEDSTRING:on_phrase} %{QUOTEDSTRING:off_phrase} \"%{TIMESTAMP_ISO8601:when}\"
但是,我得到的是字符串 %{QUOTEDSTRING)
周围的双引号,以及带有时间和日期的两个小时和分钟 %{TIMESTAMP_ISO8601:when}
{
"id": [
[
"1"
]
],
"device": [
[
"1"
]
],
"device_name": [
[
""Device 1""
]
],
"input": [
[
"1"
]
],
"input_name": [
[
""Input 1""
]
],
"state": [
[
"0"
]
],
"on_phrase": [
[
""On""
]
],
"off_phrase": [
[
""Off""
]
],
"when": [
[
"2020-01-01T00:00:00.1124303+00:00"
]
],
"YEAR": [
[
"2020"
]
],
"MONTHNUM": [
[
"01"
]
],
"MONTHDAY": [
[
"01"
]
],
"HOUR": [
[
"00",
"00"
]
],
"MINUTE": [
[
"00",
"00"
]
],
"SECOND": [
[
"00.1124303"
]
],
"ISO8601_TIMEZONE": [
[
"+00:00"
]
]
}
此外,当涉及到 logstash.conf
时我有点卡住了,因为我不确定 index
应该放在 output
中什么。以下代码来自 github 的先前示例:
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
manage_template => false
index => "sample-%{+YYYY.MM.dd}"
}
}
我猜我的应该是这样的:
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{INT:id} %{INT:device} %{QUOTEDSTRING:device_name} %{INT:input} %{QUOTEDSTRING:input_name} %{INT:state} %{QUOTEDSTRING:on_phrase} %{QUOTEDSTRING:off_phrase} \"%{TIMESTAMP_ISO8601:when}\"" }
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
manage_template => false
index => "sample-%{????????}"
}
}
同样,我不清楚我应该用 "sample-%{????????}"
关于 double-double-quotes:只需使用 DATA 而不是 QUOTEDSTRING:
"%{DATA:device_name}"
小时和分钟中的重复条目来自时区:第一个条目是实际小时,第二个条目是时区的小时。会议记录也一样。
要摆脱它,您需要一个自定义模式:
"(?<when>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?(?<ISO8601_TIMEZONE>Z|[+-](?:2[0123]|[01]?[0-9])(?::?(?:[0-5][0-9])))?)"
(如果您对解析时间戳完全不感兴趣,只需再次使用 DATA)。
因此,您的模式可能如下所示:
%{INT:id} %{INT:device} "%{DATA:device_name}" %{INT:input} "%{DATA:input_name}" %{INT:state} "%{DATA:on_phrase}" "%{DATA:off_phrase}" "(?<when>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?(?<ISO8601_TIMEZONE>Z|[+-](?:2[0123]|[01]?[0-9])(?::?(?:[0-5][0-9])))?)"
关于指数:
- 你可以完全省略它然后使用默认的:
logstash-%{+YYYY.MM.dd}
- 如果你想每天都有单独的索引,你可以使用
sample-%{+YYYY.MM.dd}
- 您可以使用
sample-
只有一个索引 - 您可以在索引模式中使用任何其他字段组合