Logstash 忽略(?)一个 grok 过滤器
Logstash ignores(?) one grok filter
这是我的配置:
input{
beats {
port => 55556
}
}
filter {
if "iis" in [tags] {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:log_timestamp} %{WORD:S-SiteName} %{WORD:S-ComputerName} %{IPORHOST:S-IP} %{WORD:CS-Method} %{URIPATH:CS-URI-Stem} %{NOTSPACE:CS-URI-QUERY} %{NUMBER:S-Port}$ %{NUMBER:SC-Win32-Status} %{NUMBER:SC-Bytes} %{NUMBER:CS-Bytes} %{NUMBER:Time-Taken}"}
}
}
}
filter {
if "nx" in [tags] {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:log_timestamp}\] (?<LogLevel>\[\w+\s*\]) (?<thread>\[\s*\d*\]) (?<snName>\[\w*\]) (?<snId>\[\d*\s*\d*\]) %{GREEDYDATA:message}"}
}
}
}
output{
if "nx" in [tags] {
elasticsearch {
hosts => ["localhost:9200"]
index => "nx-%{+YYYY.ww}"
user => "user"
password => "pass"
}
}
if "iis" in [tags] {
elasticsearch {
hosts => ["localhost:9200"]
index => "iis-%{+YYYY.ww}"
user => "user"
password => "pass"
}
}
}
这是一个日志示例:
[2018-02-18 15:19:04.668] [INFO ] [ 155] [AliveReportCommand] [875076019 53033] - ProcessRequest Ended: elapsed time=00:00:00.0967851, _parser.Device.IsSuccess=False
[2018-02-18 15:25:32.716] [DEBUG] [ 181] [] [] - Web Facade called: streamIDParam=-1
此日志对应于 "nx" 日志。
由于某种原因,它只是没有被摄入。我 运行 使用上面的 grok 和那个代码进行 grok 模拟,结果很好。但是,就像 "nx" 过滤器被完全忽略了一样。即使我删除 "IIS" 过滤器,Kibana 上仍然不会显示任何信息。 Logstash 中也没有任何错误。我使用 Filebeat 对两者进行了相同的设置:
- type: log
enabled: true
paths: c:\logs\*\*.log
exclude_files: ['mybeat.*']
tags: ["nx"]
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
- type: log
enabled: true
paths: C:\inetpub\logs\LogFiles\*\*.log
tags: ["iis"]
我认为你必须只使用一个filter.In你的代码你使用了两个过滤器关键字。
filter {
if "iis" in [tags] {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:log_timestamp} %{WORD:S-SiteName} %{WORD:S-ComputerName} %{IPORHOST:S-IP} %{WORD:CS-Method} %{URIPATH:CS-URI-Stem} %{NOTSPACE:CS-URI-QUERY} %{NUMBER:S-Port}$ %{NUMBER:SC-Win32-Status} %{NUMBER:SC-Bytes} %{NUMBER:CS-Bytes} %{NUMBER:Time-Taken}"}
}
}
if "nx" in [tags] {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:log_timestamp}\] (?<LogLevel>\[\w+\s*\]) (?<thread>\[\s*\d*\]) (?<snName>\[\w*\]) (?<snId>\[\d*\s*\d*\]) %{GREEDYDATA:message}"}
}
}
}
我觉得好尴尬...
问题不在于过滤器。
这是在 Kibana 上设置的时间戳。
选择正确的字段后,它立即显示出来。
这是我的配置:
input{
beats {
port => 55556
}
}
filter {
if "iis" in [tags] {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:log_timestamp} %{WORD:S-SiteName} %{WORD:S-ComputerName} %{IPORHOST:S-IP} %{WORD:CS-Method} %{URIPATH:CS-URI-Stem} %{NOTSPACE:CS-URI-QUERY} %{NUMBER:S-Port}$ %{NUMBER:SC-Win32-Status} %{NUMBER:SC-Bytes} %{NUMBER:CS-Bytes} %{NUMBER:Time-Taken}"}
}
}
}
filter {
if "nx" in [tags] {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:log_timestamp}\] (?<LogLevel>\[\w+\s*\]) (?<thread>\[\s*\d*\]) (?<snName>\[\w*\]) (?<snId>\[\d*\s*\d*\]) %{GREEDYDATA:message}"}
}
}
}
output{
if "nx" in [tags] {
elasticsearch {
hosts => ["localhost:9200"]
index => "nx-%{+YYYY.ww}"
user => "user"
password => "pass"
}
}
if "iis" in [tags] {
elasticsearch {
hosts => ["localhost:9200"]
index => "iis-%{+YYYY.ww}"
user => "user"
password => "pass"
}
}
}
这是一个日志示例:
[2018-02-18 15:19:04.668] [INFO ] [ 155] [AliveReportCommand] [875076019 53033] - ProcessRequest Ended: elapsed time=00:00:00.0967851, _parser.Device.IsSuccess=False
[2018-02-18 15:25:32.716] [DEBUG] [ 181] [] [] - Web Facade called: streamIDParam=-1
此日志对应于 "nx" 日志。 由于某种原因,它只是没有被摄入。我 运行 使用上面的 grok 和那个代码进行 grok 模拟,结果很好。但是,就像 "nx" 过滤器被完全忽略了一样。即使我删除 "IIS" 过滤器,Kibana 上仍然不会显示任何信息。 Logstash 中也没有任何错误。我使用 Filebeat 对两者进行了相同的设置:
- type: log
enabled: true
paths: c:\logs\*\*.log
exclude_files: ['mybeat.*']
tags: ["nx"]
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
- type: log
enabled: true
paths: C:\inetpub\logs\LogFiles\*\*.log
tags: ["iis"]
我认为你必须只使用一个filter.In你的代码你使用了两个过滤器关键字。
filter {
if "iis" in [tags] {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:log_timestamp} %{WORD:S-SiteName} %{WORD:S-ComputerName} %{IPORHOST:S-IP} %{WORD:CS-Method} %{URIPATH:CS-URI-Stem} %{NOTSPACE:CS-URI-QUERY} %{NUMBER:S-Port}$ %{NUMBER:SC-Win32-Status} %{NUMBER:SC-Bytes} %{NUMBER:CS-Bytes} %{NUMBER:Time-Taken}"}
}
}
if "nx" in [tags] {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:log_timestamp}\] (?<LogLevel>\[\w+\s*\]) (?<thread>\[\s*\d*\]) (?<snName>\[\w*\]) (?<snId>\[\d*\s*\d*\]) %{GREEDYDATA:message}"}
}
}
}
我觉得好尴尬...
问题不在于过滤器。 这是在 Kibana 上设置的时间戳。 选择正确的字段后,它立即显示出来。