從sponsor那里收到了一個很奇怪的需求,客戶需要用splunk的fowarder將日志同時輸出到syslog服務(wù)器中,而且不能用別的forwarder,所以我提出的用Fluentd就被否定了。領(lǐng)導(dǎo)命令大于天,雖然syslog沒用過,但是也只能硬著頭皮上了。
在slack channel里面問了下,大神們紛紛表示沒做過,但是splunk的文檔指出heavy forwarder可能可以同時將日志發(fā)給第三方的日志服務(wù)器比如syslog server。理論上來說分兩步:
- 將
universal splunk fowarder變?yōu)?code>heavy forwarder,并重啟服務(wù),文檔在此 - 在SplunkForwarder的
outputs.conf添加對應(yīng)的配置文件,文檔在此
接下來就是得去驗(yàn)證這些配置是否正確,簡單來講就是啟動一個splunk服務(wù)器和一個syslog服務(wù)器,然后把把任意的splunk收集的日志轉(zhuǎn)發(fā)給syslog服務(wù)器。
OK,首先找了兩個合適的docker image,寫在一個docker-compose文件中,減少配置修改的成本,同時方便通信。
version: '2'
services:
splunk:
image: dmaxwell/splunk
container_name: splunk
ports:
- "8000:8000"
- "9997:9997"
- "8088:8088"
- "1514:1514"
links:
- syslog:syslog
syslog:
image: voxxit/rsyslog
用docker-compose up -d啟動,訪問localhost:8000可以先更改下admin的密碼。其次attach到splunk的container上面,做下面的操作:
1: 測試能否以tcp的方式連接到syslog服務(wù)器, looks good.
docker-compose exec splunk bash
root@003b513bb0f7:/# telnet syslog 514
Trying 172.26.0.2...
Connected to syslog.
Escape character is '^]'.
2 : 將universal splunkfowarder變成heavy splunkfowarder:
/opt/splunk/bin/splunk enable app SplunkForwarder -auth admin:password
#重啟splunk服務(wù)
/opt/splunk/bin/splunk restart
3: 在splunkforwarder配置文件opt/splunk/etc/apps/SplunkForwarder/default/outputs.conf中添加下面的內(nèi)容:
[syslog]
defaultGroup=syslogGroup
[syslog:syslogGroup]
server = syslog:514
因?yàn)槭莝pike,所以沒有過濾日志內(nèi)容。很慫的又重啟了一次 -_-!
4: 登陸到syslog服務(wù)器上,看不太懂/etc/rsyslog.conf內(nèi)容,不過tail了下/var/log/messages,哇塞竟然看到來自splunk的日志了。
所以從splunkforwarder發(fā)送日志到syslog服務(wù)器是沒有問題的,文檔誠不欺我。但是怎么把它保存到不同的,我不禁陷入了沉思, hmm......。
顯然沉思沒有文檔有用-_-! 在這里發(fā)現(xiàn)似乎可以通過過濾消息內(nèi)容來將日志保存在其它文件中。
比如像這樣把下面的配置加到/etc/rsyslog.conf中,目的是將包含splunk字符串的日志都過濾到另外一個文件中。
:msg, contains, "splunk" action(type="omfile" file="/var/log/splunk.log")
反復(fù)測試后,又成功了……,yeah!
但是這種粗暴的方式很容易把無關(guān)的日志也保存到一起,如果可以通過某種方式可以鑒別日志的來源或者格式來過濾會不會更好些?從日志format上來區(qū)分的方式嘗試沒有成功,但是通過給遠(yuǎn)程主機(jī)來定制一個模板方式成功了。比如像下面這樣在/etc/rsyslog.d/加一個splunk.conf文件,內(nèi)容如下:
## preserve sending host fqdn
$PreserveFQDN on
#
# Receive outside syslog
$template RemoteHost, "/var/log/%HOSTNAME%/1.log"
$RuleSet remote
*.* ?RemoteHost
#Listeners
$InputTCPServerBindRuleset remote
$InputTCPServerRun 5144
這里我讓syslog監(jiān)聽另外一個端口,對應(yīng)的也需要在splunk的outputs.conf中添加新的syslog server配置。各種重啟之后成功的看到了不斷更新的/var/log/splunk.splunk_default/1.log日志文件。
基本上一個初步的解決方案應(yīng)該已經(jīng)形成了,簡單的閱讀了rsyslog文檔,了解下配置,差不多就是這樣了,畢竟好像有s/1hours/3hours/g沒有給老婆打電話了,docker-compose down,然后瑟瑟發(fā)抖的拿起了電話……。