概述
之前已经实现了syslog到logstash到elasticsearch的一个syslog收集过程。但是有个问题一直困扰我,就是有些设备因为比较老,不支持将syslog送到不同的端口,所以他们的日志在kibana里就很难区分,也就不太好针对性的去做解析了。
折腾了一下午,google无数+es论坛的帮助,基本解决了这个问题。
解决方法
大致的思路还是在logstash上做文章。我们知道,logstash的配置文件分为三个部分,即input 、filter 和output 。
首先在input 这里,参数如下。这里需要注意的是,host 是logstash的监听地址,而不是发送syslog的源地址。
syslog{
type => "syslog-generic"
host => "1.2.3.4"
port => 514
}
那么,所有送到514 端口的日志,我们都会给他打上一个syslog-generic 的type 。
重点来了,在filter 部分,我们这样写:
if [host] == "1.2.3.4" {
mutate {
replace => { "[type]" => "syslog-dns-query"}
}
}
这段也很简单,如果host 是1.2.3.4 ,那么我们把type replace为syslog-dns-query 。当然,这里也是可以设置grok 语法的。 至于output 部分就不说了,正常操作即可。
总结
第一个问题是如何区分。在input哪里,我们没法区分端口,那就简单一点,直接监听514并且给一个默认的type 。
最重要的来了,我们其实可以分析下收到的日志
这张图,如果我们要用这里的severity的话,我们就得使用[fields][severity] ,在es论坛看了半天没搞明白这个fields是啥,在这里其实就能看出来了。
这张图,我们可以看到标红部分的host,是一个text字段,那么我们直接就可以匹配了。如果是数组可能还麻烦一点。 同时他还有其他一些字段也可以利用,比如tag啥的。
这样一来,其实很简单是不是?
另外,似乎据说logstash的性能不是太好,下面可以考虑用pipeline 或者其他形式来实现。好在logstash+syslog的形式不需要对原设备进行改造或者安装软件,还是很方便的。
|