删除包含特定字符串的日志消息
Drop log messages containing a specific string
所以我有以下格式的日志消息:
[INFO] <blah.blah> 2016-06-27 21:41:38,263 some text
[INFO] <blah.blah> 2016-06-28 18:41:38,262 some other text
现在我想删除所有不包含特定字符串的日志 "xyz" 并保留所有其他内容。我也想索引时间戳。
grokdebug 帮助不大。
这是我的尝试:
input {
file {
path => "/Users/username/Desktop/validateLogconf/logs/*"
start_position => "beginning"
}
}
filter {
grok {
match => {
"message" => '%{SYSLOG5424SD:loglevel} <%{JAVACLASS:job}> %{GREEDYDATA:content}'
}
}
date {
match => [ "Date", "YYYY-mm-dd HH:mm:ss" ]
locale => en
}
}
output {
stdout {
codec => plain {
charset => "ISO-8859-1"
}
}
elasticsearch {
hosts => "http://localhost:9201"
index => "hello"
}
}
我是 grok 的新手,所以上面的模式可能没有意义。请帮忙。
要检查您的消息是否包含子字符串,您可以这样做:
if [message] =~ "a" {
mutate {
add_field => { "hello" => "world" }
}
}
因此,在您的情况下,您可以使用 if 来调用 drop{} 过滤器,或者您可以将输出插件包装在其中。
要解析日期并将其写回您的时间戳字段,您可以使用如下内容:
date {
locale => "en"
match => ["timestamp", "ISO8601"]
timezone => "UTC"
target => "@timestamp"
add_field => { "debug" => "timestampMatched"}
}
这与我的时间戳相匹配:
- 源字段:"timestamp"(查看匹配项)
- 格式为 "ISO...",您可以使用与您的时间戳匹配的自定义格式
- 时区 - 不言自明
- 目标 - 将其写回事件的“@timestamp”字段
- 添加调试字段以检查是否已正确匹配
希望对您有所帮助,
亚瑟
删除不包含字符串 xyz
的消息:
if ([message] !~ "xyz") {
drop { }
}
您的 grok 模式没有抓取日志的日期部分。
一旦你的 grok 模式中有一个包含日期的字段,你就可以在这个字段上调用日期过滤器。
所以你的神交过滤器应该是这样的:
grok {
match => {
"message" => '%{SYSLOG5424SD:loglevel} <%{JAVACLASS:job}> %{TIMESTAMP_ISO8601:Date} %{GREEDYDATA:content}'
}
}
我添加了一个部分来获取日期,它将在字段 Date
中。然后你可以使用日期过滤器:
date {
match => [ "Date", "YYYY-mm-dd HH:mm:ss,SSS" ]
locale => en
}
我添加了 ,SSS
以便格式与 Date
字段中的格式匹配。
解析的日期将存储在 @timestamp
字段中,除非使用 target
参数进行了不同的指定。
所以我有以下格式的日志消息:
[INFO] <blah.blah> 2016-06-27 21:41:38,263 some text
[INFO] <blah.blah> 2016-06-28 18:41:38,262 some other text
现在我想删除所有不包含特定字符串的日志 "xyz" 并保留所有其他内容。我也想索引时间戳。
grokdebug 帮助不大。
这是我的尝试:
input {
file {
path => "/Users/username/Desktop/validateLogconf/logs/*"
start_position => "beginning"
}
}
filter {
grok {
match => {
"message" => '%{SYSLOG5424SD:loglevel} <%{JAVACLASS:job}> %{GREEDYDATA:content}'
}
}
date {
match => [ "Date", "YYYY-mm-dd HH:mm:ss" ]
locale => en
}
}
output {
stdout {
codec => plain {
charset => "ISO-8859-1"
}
}
elasticsearch {
hosts => "http://localhost:9201"
index => "hello"
}
}
我是 grok 的新手,所以上面的模式可能没有意义。请帮忙。
要检查您的消息是否包含子字符串,您可以这样做:
if [message] =~ "a" {
mutate {
add_field => { "hello" => "world" }
}
}
因此,在您的情况下,您可以使用 if 来调用 drop{} 过滤器,或者您可以将输出插件包装在其中。
要解析日期并将其写回您的时间戳字段,您可以使用如下内容:
date {
locale => "en"
match => ["timestamp", "ISO8601"]
timezone => "UTC"
target => "@timestamp"
add_field => { "debug" => "timestampMatched"}
}
这与我的时间戳相匹配:
- 源字段:"timestamp"(查看匹配项)
- 格式为 "ISO...",您可以使用与您的时间戳匹配的自定义格式
- 时区 - 不言自明
- 目标 - 将其写回事件的“@timestamp”字段
- 添加调试字段以检查是否已正确匹配
希望对您有所帮助,
亚瑟
删除不包含字符串 xyz
的消息:
if ([message] !~ "xyz") {
drop { }
}
您的 grok 模式没有抓取日志的日期部分。
一旦你的 grok 模式中有一个包含日期的字段,你就可以在这个字段上调用日期过滤器。
所以你的神交过滤器应该是这样的:
grok {
match => {
"message" => '%{SYSLOG5424SD:loglevel} <%{JAVACLASS:job}> %{TIMESTAMP_ISO8601:Date} %{GREEDYDATA:content}'
}
}
我添加了一个部分来获取日期,它将在字段 Date
中。然后你可以使用日期过滤器:
date {
match => [ "Date", "YYYY-mm-dd HH:mm:ss,SSS" ]
locale => en
}
我添加了 ,SSS
以便格式与 Date
字段中的格式匹配。
解析的日期将存储在 @timestamp
字段中,除非使用 target
参数进行了不同的指定。