我在解析日志时面临一些问题。
我有日志行,并且每个日志都包含一个主机名,如ABC123DF 我写了一个正则表达式,我想将它应用于日志并将主机名放在“受害者”字段中这样:
add_field => [ "victim", "/[a-z][a-z][a-z][0-9][0-9][0-9].."
我使用了Mutate过滤器但结果是
受害者/ [a-z] [a-z] [a-z] [0-9] [0-9] [0-9] ..
我想看看:
受害者ABC123DF
我该怎么做?
答案 0 :(得分:2)
您甚至不需要复杂的正则表达式操作来实现此目的。您可以使用several filters提取字段。在您的情况下,grok filter是一个不错的选择。
我们假设您的日志行如下所示:
20:20:20 ABC123DF 192.168.1.1
然后像这样的 grok过滤器会正确解析主机名:
grok {
match => { "message" => "%{TIME:timestamp} %{HOST:host} %{IP:srcip}" }
}
您还可以在grok (docs)中使用正则表达式。示例模式:
%{GREEDYDATA} (?<host>.*) %{GREEDYDATA}
但是,我建议在grok中避免使用正则表达式。使用包含的模式是一种更好的方法。使用grok debugger为您找到合适的模式。
答案 1 :(得分:2)
我使用此网站http://grokconstructor.appspot.com/do/match#result来测试我的正则表达式。
在我的mongodb日志中,我有这样的文字:
2016-05-17T16:26:07.018-0300 I QUERY [conn50628097] getmore dataBaseName.collectionName查询:{empresa:&#34; ********&#34; } cursorid:443889850763 ntoreturn:0 keyUpdates:0 writeConflicts:0 numYields:69 nreturned:8886 reslen:1184746 locks:{Global:{ acquireCount:{r:140}},数据库:{acquireCount:{r:70}, acquireWaitCount:{r:66},timeAcquiringMicros:{r:98046}}, 收集:{acquireCount:{r:70}}} 178ms
为了获取查询和时间,在配置文件中,我创建了这个过滤器:
filter {
if [source] == "/var/log/mongodb/mongod.log" {
grok {
match=> {
"message" => [
"(getmore|query)\s(?<mongo_database>[a-zA-Z_]+)\.(?<mongo_collection>[a-zA-Z_.]+)\s?query:\s(?<mongo_query>\{.*?\})\s(cursorid|planSummary).*?\s(?<mongo_totaltime>[0-9]+ms)"
]
}
}
}
}
使用:
(?<you_new_field_name>you_regex)you_regex(?<you_new_field_name>you_regex)(?<you_new_field_name>you_regex)
之后,你可以:
add_field => [ "tag_text_optional%{you_new_field_name}", "%{you_new_field_name}" ]
答案 2 :(得分:0)
所以在我的情况下,日志是:
2015-10-20 14:45:42,156 [pool-3-thread-1] INFO审核终止abc123df来自LLDS2Cassandra [LOCAL]组与NetworkCorruption
grok {
match => { "message" => "%{TIME:timestamp} %{LOGLEVEL} %{VICTIM:victim} " }
}
在grok模式中,我将以下行:
VICTIM [a-z][a-z][a-z][0-9][0-9][0-9]
。
获得以下结果:
FIELD:TIMESTAMP 价值:2015-10-20 14:45:42,156
FIELD:VICTIM 价值:abc123df
领域:LOGLEVEL
VALUEE:INFO