【logstash】解析 postfix 的 log grok pattern

動機


總之 logstash 是有了
接下來就是玩樂時間,玩正則玩死你
對我來講接下來就是全新的陌生領域了

目標就是把裡面的值解析出來丟進 elasticsearch 裡面


想法


詢問了一下有玩過的人該怎麼做
但是還是沒什麼頭緒
總之同事說裡面有血 dsn 的就是重要資料
頭都洗下去了,洗完吧...

動手做


首先看一下本來的log長怎樣
發現 sendmail 跟 postfix 的 log 糾結在一起
rsyslog厲害的地方就在這邊吧...
就從 postfix 開始玩吧
先看一下log長怎樣
Nov 27 01:19:13 server server postfix/smtp[16578]: 06273100244: to=, 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)
大概就是這樣,然後寫一個conf檔餵給他
接著祈求他會回應你。
簡單的看了一下 logstash 的官方網站文件
大概就是把自己的正則拆成一個一個的pattern
然後組成一句完整的字串這樣。

對了這邊我在網路上找到兩個不錯用的網站
可以直接測試自己的grok能不能用
http://grokconstructor.appspot.com/do/match#resulthttp://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
接著就是看他一直洗版了

留言