2021年9月3日 星期五

Setup Logstash in production server with logstash-input-journald

近月來我都是使用部屬單體應用程式居多,每次都要連上 Remote Server 開 journalctl 看 log 錯誤,為了求方便及可以做 BI,所以就希望把 journalctl 資料撈回來,其中以不影響 code 為主要目的。

之所以用 journalctl 是因為原本程式就沒有設計要做 logging, monitoring,所以希望用外掛的方式來達成。


HAProxy for receive inbound log


首先,本地端你應該有準備好 ELK 了,而且可以開一個 Port 在 IP 上接收傳來的資訊,提供我個人的設定方式,從外部 log 進入內部網路,我是使用 HAProxy 來處理 Load-Balance,所以只要在設定中加入一個 backend 就可以實現從 domain name 傳資訊回來。

(/etc/haproxy/haproxy.cfg)

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http


frontend http-in
        bind *:80

        # define incomming connection to variable (for elasticsearch elk)
        acl ACL_elk hdr_beg(host) -i elk.XXXXXXXX.com
        
        # define redirect when matching to url
        use_backend elk if ACL_elk


backend elk
        option forwardfor
        server elk 10.6.1.51:9200 check (指向 ELK Server)


完成修改之後,需要重啟 sudo systemctl restart haproxy.service。


遠端 Server 安裝 Logstash


遠端伺服器也需要裝 Logstash 而且讓他跑在 daemon ,才會送資料回來,安裝方式是:


wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
sudo apt-get update && sudo apt-get install logstash


Logstash Journalctl Input Plugin


Logstash 並不認識 journalctl 也不知道怎樣把他的資料當作 input,所以需要透過外掛達成,外掛安裝方式是:


git clone https://github.com/logstash-plugins/logstash-input-journald.git
cd logstash-input-journald
gem build logstash-input-journald.gemspec
sudo /usr/share/logstash/bin/logstash-plugin install /home/deploy/logstash-input-journald/logstash-input-journald-*.gem


設定及開啟 Logstash 


讓遠端 Server 開啟 Logstash 是為了要讓資料傳回來,不是要開 Logstash Server,所以只需要設定完 Logstash 並給 Data Folder 設定權限,就可以開啟了:


chown -R logstash.lostash /usr/share/logstash
chown -R /usr/share/logstash
sudo chmod 777 /usr/share/logstash/data
sudo chmod -R 777 /usr/share/logstash

# 開啟
sudo systemctl start logstash
sudo systemctl enable logstash


撰寫 Journalctl Logstash Config


完成設定開啟 Logstash 後,要寫一份設定檔案,讓 Log 可以按照你要的方式傳回去,則可參考以下寫法:

(journalctl.logstash)

input {
     journald {
       lowercase => true
       seekto => "head"
       thisboot => true
       type => "[你程式 journalctl 的 syslog-identify]"
       tags => [ "自訂 TAG 名稱" ]
       sincedb_path => "/home/deploy/.sincedb_journal"
     }
}

filter {

	# 要加入 filter,否則它會把所有 log 回傳,會造成 CPU 100%
    if([syslog_identifier] !~ "[你程式 journalctl 的 syslog-identify]") {
          drop { }
    }

}

output {
  elasticsearch { 
        hosts => ["https://elk.XXXXXXX.COM:443"] 
        ssl => true
        index => "[自訂的 ELK Index 名稱]-%{+YYYY.MM.dd}"
  }
  stdout {codec => rubydebug}
}


在撰寫上,要特別注意 journalctl logstash 會把所有系統的 log 回傳,很容易造成 CPU 100%,加上這個 filter 過濾掉只要你要的資料,像是對照 journalctl -xefu [你程式 journalctl 的 syslog-identify] 這個做法只列出你要的資料, CPU 基本上就會被降到非常非常低,我自己看的結果是只有 4% 。


套用設定


寫完設定檔之後,只需要把這個檔案套用到 logstash 就可以在本地端看見結果了。


sudo /usr/share/logstash/bin/logstash -f journal.logstash --path.data ./temp_data

沒有留言:

張貼留言

© Mac Taylor, 歡迎自由轉貼。
Background Email Pattern by Toby Elliott
Since 2014