rsyslog 是基於 syslog 後衍生出來的新 service,新的系統在支援與設定上都遠優於 syslog,使用更簡單設定,進行大量的模組化修改,增加了彈性與更容易閱讀。這樣的調整讓 Linux 系統家族大量的預設採用 rsyslog,例如在作業系統 CentOS 7.5 已經將 rsyslog 8 版本帶進系統。
Environment
OS:CentOS 7.5
rsyslog:8.24.0
rsyslog-relp:16.el7_5.4
寫這篇的原因是大家在使用 rsyslog 最多都使用 UDP 或是 TCP,或使用 ommysql,但是現在出了很多其他的方式輸出 log,如我們今天所要介紹的 RELP wiki
這項新的協定從 2008 開始,到現在已經廣泛用在各個地方上,在 red hat 的官方文件中也有章節特別套論這個技術。這樣技術保證了資料傳輸的穩定性,除了一般用的 TCP 保護了資料傳輸,他保證了資料傳輸後的續傳。因此,這項新技術大量在金融業中被採用,主要支持系統中完全不容許資料遺失。
而在 rsyslog 中,目前版本內有了大量的設定模式被修改,以模組的方式調整了設定,而 rsyslog 這樣的改動其實在很多教學內都沒有這樣的說明,red hat 文件更是混雜在一起,因此經過多次踩雷後,終於完成了設定。
rsyslog server
安裝 rsyslog-relp
sudo yum install rsyslog-relp
RELP 雖然被 rsyslog 支援,但是並沒有預設安裝進系統,所以要安裝 module
編輯設定檔
設定 /etc/rsyslog.conf 與 /etc/rsyslog.d/remote.conf
一般來說個人化的設定都應該放在 /etc/rsyslog.d/remote.conf,這檔案應該保存系統管理者為系統特殊修改過的設定,這樣才不會因升級造成原本服務離線,這裡將多出的檔案命名為 remote.conf,但可以任意命名,因為在 /etc/rsyslog.conf 有以下的設定。
$IncludeConfig /etc/rsyslog.d/*.conf
也就是說 /etc/rsyslog.d/ 目錄下,只要為 .conf 結尾的檔案就會被引入
依照系統需求帶入不同的 module,這邊開啟了三個模組,分別為 UDP, TCP 與 relp
在 rsyslog 有分 input 與 output,這邊引入 im 開頭代表是 input module
module(load="imudp") input(type="imudp" port="514") module(load="imtcp") input(type="imtcp" port="514") module(load="imrelp") input(type="imrelp" port="20514")
首先些把 module load 進入 rsyslog,在讓 rsyslog 去監聽網路的端口,這裡要注意的是 relp 也是一種 tcp 的協定,所以不可能讓 tcp 與 relp 放在同一個端口上,也就是說 tcp 如果已經使用 514 則 relp 就不可能繼續用 514 當作他服務的端口。
在 module 帶入的時候可以同時把 rules 帶入,但是其實到發文這天,我對於這件事情還沒有深入的研究,到底 rules 跟 module 的關係。
上面已經把 relp 開請,監聽端口為 20514,接下來就要設定 log 收集進來後怎麼處理。rsyslog 還包含了 log 的分析與預先處理,不過我們後邊要用 Splunk 進行 log 分析,所以前面對 log 就不分析也不做處理了,所有 log 單純寫進檔案而已,這樣對於系統設定也簡單很多。
在 rsyslog 中可以設定檔案要寫去哪裡,路徑也可以是動態分配的,路徑可以利用 rsyslog 的變數去改變,例如,使用者可能希望可以利用 hostanme 作為區分每個檔案來自何處,則可以在目標檔案中加入 %hostname% 即可,這編寫的設定都是用於新的版本,設定起來更像是模組架構。
template(name="SecurePath" type="list") { constant(value="/var/log/remote/") property(name="hostname") constant(value="/secure.log") } authpriv.* ?SecurePath
template 宣告了一個模板,這個可以被多次套用在各個地方,這邊定義的是一個 file path,使用的 type 是 list,在 rsyslog 中其實定義了 4 種模式,但是官方推薦使用 list,在舊版本中設定都皆是以 string 方式執行。
在 list 中,constant 代表不可以改變的量,property 代表是一個變數。因此在範例中,log 盪案就會送入 /var/log/remote//secure.log,並且把 hostname 替換成來源伺服器的名稱,例如來源伺服器的 hostname 為 mysql,則本機的路徑便會是 /var/log/remote/mysql/secure.log。
最後在 log 寫入的時候套用 template,就是最後一條設定。
rsyslog client
安裝 rsyslog-relp
sudo yum install rsyslog-relp
同樣的,在 client 上面也沒有 relp,所以必須安裝,不過我們這次不用 imrelp,而是使用 omrelp
修改設定檔案,無論是否要使用 rsyslog.d 的目錄都必須要加入
module(load="omrelp") authpriv.* action(type="omrelp" target="loghost" port="20514")
第一要導入 omrelp,第二對於要送出去的 log 要設定執行方式,利用 omrelp 送出,並且送往 loghost 的 20514 端口。
最後
理論上到這邊,將 server 端與 client 端重開,資料就應該從 client 送入 server,如果沒有,那就要檢查一下系統的防火牆,或是 SELinux 在搞怪。
這邊對於各項設定沒有做更多的解釋,主要是目的提供一個使用 relp 的 log 傳輸方式,並且以最新的設定方式作為範例。
Hello there. I discovered your blog by the use of Google while searching for a similar matter, your site got here up. It appears to be great. I have bookmarked it in my google bookmarks to visit then.