近月來我都是使用部屬單體應用程式居多,每次都要連上 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
沒有留言:
張貼留言