動機
總之 logstash 是有了
接下來就是玩樂時間,玩正則玩死你
對我來講接下來就是全新的陌生領域了
目標就是把裡面的值解析出來丟進 elasticsearch 裡面
想法
詢問了一下有玩過的人該怎麼做
但是還是沒什麼頭緒
總之同事說裡面有血 dsn 的就是重要資料
頭都洗下去了,洗完吧...
動手做
首先看一下本來的log長怎樣
發現 sendmail 跟 postfix 的 log 糾結在一起
rsyslog厲害的地方就在這邊吧...
就從 postfix 開始玩吧
先看一下log長怎樣
Nov 27 01:19:13 server server postfix/smtp[16578]: 06273100244: to=大概就是這樣,然後寫一個conf檔餵給他, relay=my@myhome.com[255.255.255.255]:25, delay=0.5, delays=0.03/0/0.02/0.45, dsn=2.0.0, status=sent (250 ok dirdel)
接著祈求他會回應你。
簡單的看了一下 logstash 的官方網站文件
大概就是把自己的正則拆成一個一個的pattern
然後組成一句完整的字串這樣。
對了這邊我在網路上找到兩個不錯用的網站
可以直接測試自己的grok能不能用
http://grokconstructor.appspot.com/do/match#result 跟 http://grokdebug.herokuapp.com/
後者有做即時的ajax,可是公司的電腦爛到靠杯
所以我還是用前者
接著就是實戰了
老實講沒什麼技術含量
就是無盡的正則驗證地獄
首先把自己寫好的 grok pattern 放好
然後寫 conf 檔的時候就把這個path加進去這樣
他就自動吃得到了。
相關的固定用法自己看官網做中學了
不免俗的取之於網路,先找 github
雖然說是直接找的,但是直接用是不行的
說到底你還是得去看那些天書
這邊直接曬修改過後的 pattern
postfixPattern/postfix.grok
COMPID \[%{POSINT:pid}\]: QUEUEID (?:[A-F0-9]+|NOQUEUE) EMAILADDRESS %{EMAILADDRESSPART:local}@%{EMAILADDRESSPART:remote} EMAILADDRESSPART [a-zA-Z0-9_.+-=:]+ RELAY (?:%{HOSTNAME:relayhost}(?:\[%{IP:relayip}\](?::[0-9]+(.[0-9]+)?)?)?) POSREAL [0-9]+(.[0-9]+)? DSN %{NONNEGINT}.%{NONNEGINT}.%{NONNEGINT} STATUS sent|deferred|bounced|expired POSTFIXSMTP %{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{SYSLOGHOST:hostname2} postfix/smtp%{COMPID} %{QUEUEID:qid}: to=<%{EMAILADDRESS}>, relay=%{RELAY}, delay=%{POSREAL}, (%{WORD}=%{DATA},)+ dsn=%{DSN:dsn}, status=%{STATUS:result} %{GREEDYDATA:reason} POSTFIXSMTPERROR %{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{SYSLOGHOST:hostname2} postfix/error%{COMPID} %{QUEUEID:qid}: to=<%{EMAILADDRESS}>, relay=%{RELAY}, delay=%{POSREAL}, (%{WORD}=%{DATA},)+ dsn=%{DSN:dsn}, status=%{STATUS:result} %{GREEDYDATA:reason}然後 config 檔的部分
input { file { type => "maillog" path => ["/path/to/mail"] # debug => "true" } } filter { #沒有dsn的都不處理 if ([message] !~ /dsn/){ drop{} } #處理postfix的 if ([message] =~ /postfix/){ grok { patterns_dir => "/path/to/postfixPattern" match => {"message"=>"%{POSTFIXSMTP}|%{POSTFIXSMTPERROR}|%{POSTFIXSMTPCONN}"} } } } output { # stdout {} elasticsearch { hosts => ["255.255.255.255:99999"] flush_size => 1000 index => "maillog-%{+YYYY.MM.dd}" codec => "plain" workers => 1 manage_template => true template_name => "logstash" template_overwrite => false idle_flush_time => 1 } }有趣的就是固定用法 drop{}
會把不需要的丟掉
驗證
# ./logstash agent --config /path/to/config接著就是看他一直洗版了
留言
張貼留言