[英]logstash, syslog and grok
我正在研究ELK堆栈配置。 logstash-forwarder用作日志传送器,每种日志类型都带有一个类型标签:
{
"network": {
"servers": [ "___:___" ],
"ssl ca": "___",
"timeout": 15
},
"files": [
{
"paths": [
"/var/log/secure"
],
"fields": {
"type": "syslog"
}
}
]
}
那部分工作正常...现在,我希望logstash将消息字符串分成几个部分; 幸运的是,这已经在默认的grok模式中实现了,因此到目前为止,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以便按日期进行过滤...知道我做错了吗?
谢谢,丹尼尔
您的“消息”字段包含原始日志行(包括时间戳等)的原因是,默认情况下,grok过滤器不允许覆盖现有字段。 换句话说,即使是SYSLOGLINE模式 ,
SYSLOGLINE %{SYSLOGBASE2} %{GREEDYDATA:message}
将消息捕获到“消息”字段中,不会覆盖当前字段值。 解决方案是设置grok过滤器的“覆盖”参数 。
grok {
match => [ "message", "%{SYSLOGLINE}" ]
overwrite => [ "message" ]
}
要填充“ @timestamp”字段,请使用日期过滤器 。 这可能为您工作:
date {
match => [ "timestamp", "MMM dd HH:mm:ss", "MMM d HH:mm:ss" ]
}
在没有看到导致您出现问题的示例事件的情况下很难知道是什么问题。 我可以建议您尝试使用grok调试器 ,以验证模式是否正确,并在发现问题后根据需要对其进行调整。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.