2013-07-15 93 views
3

我正在使用Logstash(使用Kibana作为UI)。我想从我的日志中提取一些字段,以便我可以在UI的LHS中对它们进行过滤。在Logstash中提取字段

从我的日志中的样本行看起来是这样的:

2013-07-04 00:27:16.341 -0700 [Comp40_db40_3720_18_25] client_login=C-316fff97-5a19-44f1-9d87-003ae0e36ac9 ip_address=192.168.4.1 

在我logstash的conf文件,我把这个:

filter { 
    grok { 
     type => "mylog" 
     pattern => "(?<CLIENT_NAME>Comp\d+_db\d+_\d+_\d+_\d+)" 
    } 
} 

理想情况下,我想提取Comp40_db40_3720_18_25(数量数字可能会有所不同,但在由_)和client_login(也可以是client_logout)分隔的每个部分中将始终至少为1。然后,我可以搜索CLIENT_NAME = Comp40 ... CLIENT_NAME = Comp55等。

我是否在配置中缺少某些内容以使其成为我可以在Kibana中使用的字段?

谢谢!

+0

正则表达式看起来不错,但我会使用类似(比较[_a-Z \ d] + )。你可以请分享一下不起作用的东西。顺便说一下,我假设你的conf文件中还定义了elasticsearch输出。 –

+0

是的,我在Logstash中使用ES的嵌入式实例。我想我期望的是,如果我点击LHS上的@ fields.client_name(在列下),它会显示出它已经提取的所有字段的计数,甚至是它们的列表,即Comp40。 ,Comp55等。这有道理吗? – user2406467

+0

我想我想要的就是Logstash/Kibana演示(http://demo.logstash.net/)上的最佳示例。如果您点击@消息,您可以看到该类型顶部“类别”的5个左右的细分。 – user2406467

回答

4

如果您无法正确匹配模式,使用Grok Debugger是一个很好的解决方案。

对于给定的问题,您可以将您的搜索数据分隔到另一个变量中,并将其他变量数字另存为另一个(垃圾)变量。

例如:

(?<SEARCH_FIELD>Comp\d+)%{GREEDYDATA:trash_variable}] 

(请在上述模式中使用Grok Debugger