2014-11-14 67 views
0

我正在使用ELK堆栈配置。 logstash-转发用作日志托运人,记录每种类型的标记有一个类型标签:logstash,syslog和grok

{ 
    "network": { 
    "servers": [ "___:___" ], 
    "ssl ca": "___", 
    "timeout": 15 
    }, 
    "files": [ 
    { 
     "paths": [ 
     "/var/log/secure" 
     ], 
     "fields": { 
     "type": "syslog" 
     } 
    } 
    ] 
} 

这部分工作得很好......现在,我想logstash的消息字符串分割其部分;幸运的是,在默认模式神交已实现,所以logstash.conf仍然很简单迄今:

input { 
    lumberjack { 
     port => 6782 
     ssl_certificate => "___" ssl_key => "___" 
    } 
} 
filter { 
    if [type] == "syslog" { 
     grok { 
      match => [ "message", "%{SYSLOGLINE}" ] 
     } 
    } 
} 
output { 
    elasticsearch { 
     cluster => "___" 
     template => "___" 
     template_overwrite => true 
     node_name => "logstash-___" 
     bind_host => "___" 
    } 
} 

我这里的问题是,由elasticsearch接收的文件上仍占据整条生产线(包括时间戳等)在消息字段中。另外,@timestamp仍然显示logstash收到消息的日期,这使得搜索不好,因为kibana确实在查询@timestamp以便按日期过滤......任何想法我做错了什么?

谢谢,丹尼尔

回答

3

您的“消息”字段包含原始日志行(包括时间戳等)的原因在于缺省情况下grok过滤器不允许覆盖现有字段。换句话说,即使SYSLOGLINE pattern

SYSLOGLINE %{SYSLOGBASE2} %{GREEDYDATA:message} 

捕获消息为“Message”字段不会覆盖当前的字段值。解决方法是设置grok filter's "overwrite" parameter

grok { 
    match => [ "message", "%{SYSLOGLINE}" ] 
    overwrite => [ "message" ] 
} 

要填充“@timestamp”字段,请使用date filter。这可能适合你:

date { 
    match => [ "timestamp", "MMM dd HH:mm:ss", "MMM d HH:mm:ss" ] 
} 
+0

太棒了!我通过1)从'message'移动到'logline',2)grok'logline',3)删除'logline'来解决消息部分。 RTFM,我想...谢谢 – sontags 2014-11-18 06:20:12

0

这是很难知道的是这个问题没有看到,是造成你的问题的例子事件。我建议您尝试grok debugger以验证模式是否正确,并在发现问题后根据需要进行调整。

+1

没有多少grok模式调整将解决他的@ timestamp字段问题。 – 2014-11-17 07:13:51