在 Linux 上配置一個 syslog 伺服器
syslog伺服器可以用作一個網路中的日誌監控中心,所有能夠通過網路來發送日誌的設施(包含了Linux或Windows伺服器,路由器,交換器以及其他主機)都可以把日誌發送給它。 通過設定一個syslog伺服器,可以將不同設施/主機發送的日誌,過濾和合并到一個獨立的位置,這樣使得你更容易地查看和擷取重要的日誌訊息。
rsyslog 作為標準的syslog守護進程,預裝在了大多數的Linux發行版中。在用戶端/伺服器架構的配置下,rsyslog同時扮演了兩種角色:1.作為一個syslog伺服器,rsyslog可以收集來自其他設施的日誌資訊;2.作為一個syslog用戶端,rsyslog可以將其內部的日誌資訊傳輸到遠端syslog伺服器。
在此,我們示範了在linux上如何通過rsyslog來配置一個中心化syslog伺服器。 在進入詳解之前,先溫習一下syslog標準。
syslog標準基礎
當通過syslog機制來收集日誌時,有3個必須要考慮到的重要事情:
設施層級: 監聽何種類型的進程
嚴重性 (優先) 層級: 收集何種層級的日誌訊息
目標: 發送或記錄日誌訊息到何處
現在我們更加深入地瞭解一下配置是如何定義的。
設施層級定義了一種用來對內部系統進程進行分類的方法,linux中的一些常見的設施包括:
auth: 身分識別驗證相關的訊息(登入時)
cron: 進程或應用調度相關的訊息
daemon: 守護進程相關的訊息(內部伺服器)
kernel: 核心相關的訊息
mail: 內部郵件伺服器相關的訊息
syslog: syslog 守護進程本身相關的訊息
lpr: 列印服務相關的訊息
local0 - local7: 使用者自訂的訊息 (local7 通常被Cisco 和 Windows 伺服器 使用)
嚴重性(優先)層級有固定的標準縮寫和指代的值,其中的數字7具有最高的層級,這些層級包含了:
emerg: Emergency(緊急)- 0
alert: Alerts (警示)- 1
crit: Critical (關鍵)- 2
err: Errors (錯誤)- 3
warn: Warnings (警告)- 4
notice: Notification (通知)- 5
info: Information (訊息)- 6
debug: Debugging (調試)- 7
最後,目標語句會讓一個syslog用戶端來執行以下三個任務之一:
儲存日誌訊息到一個本地檔案;
通過TCP/UDP將訊息路由到遠端syslog伺服器中;
將其發送到一個標準輸出中,例如控制台。
在 rsyslog裡, syslog的配置是基於以下模式進行結構化的。
[facility-level].[severity-level] [destination]
在Linux中配置Rsyslog
在我們理解syslog之後,現在可以通過rsyslog來將一個Linux伺服器配置為一個中心syslog伺服器了,另外我們也將看到如何在一個Windows的系統上配置一個syslog用戶端來發送內部日誌到該syslog伺服器中。
第1步: 初始化系統需求
要將linux主機設定為一個中央Log Service器, 我們需要建立一個分離的 /var 分區,並分配足夠大的磁碟空間或者建立一個特殊的LVM卷組。這樣就會使得syslog伺服器能夠承擔在日積月累收集日誌所帶來的潛在增長。
第2步: 讓rsyslog 後台進程生效
rsyslog守護進程來自於當前的linux發布版本的預裝模組,但是預設並沒有啟動。為了能夠讓rsyslog守護進程能夠接受外部的訊息,需要編輯其設定檔/etc/rsyslog.conf.
開啟檔案進行編輯,尋找到下面的兩行所在的位置,通過刪除其行首的#字元來取消注釋。
$ModLoad imudp
$UDPServerRun 514
這會使得rsysolog守護進程能夠在UDP連接埠514上接受日誌訊息了---UDP是一種比TCP速度快,但是並不具有TCP一樣的資料流的可靠性。所以如果你需要使用可靠的傳送機制,就可以通過取消以下行的注釋。
$ModLoad imtcp
$InputTCPServerRun 514
需要注意的是,TCP和UDP可以被同時生效來監聽TCP/UDP 串連。
第3步:建立日誌接收模板
接下來的這步,需要我們來為遠程訊息建立模板,並告知rsyslog守護進程如何記錄從其他用戶端機器所接受到的訊息。
使用文字編輯器來開啟 /etc/rsyslog.conf,然後在GLOBAL DIRECTIVE塊前追加以下的模板。
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" *
*.* ?RemoteLogs
& ~
在此對該模板進行簡單解釋,$template RemoteLogs(這裡“RemoteLogs” 字串可以為任何其他的描述性的名稱)指令使rsyslog後台進程將日誌訊息寫到/var/log下的單獨的本地記錄檔中,其中記錄檔的名稱是基於遠程日誌發送機器的主機名稱以及產生該日誌的應用程式名稱進行定義的。其中第二行暗示了我們將RemoteLogs模板應用到所有接收到的日誌上。
符號"& ~"表示了一個重新導向規則,被用來告知rsyslog守護進程停止對日誌訊息的進一步處理,並且不要在本地寫入。如果沒有使用該重新導向規則,那麼所有的遠程訊息都會在寫入上述描述的記錄檔之外同時被寫入到本地記錄檔,這就意味著日誌訊息實際上被寫了兩次。使用該規則的另外一個結果就是syslog伺服器本身的日誌訊息只會被以該機器主機名稱命名的專有檔案中。
如果你想要的話,也可以使用下面的模式對特定的裝置或嚴重性層級使用新的模板直接來記錄日誌訊息。
[facility-level].[severity-level] ?RemoteLogs
例如:
將全部優先順序別的所有內部使用者驗證訊息指定為RemoteLogs模板:
authpriv.* ?RemoteLogs
將所有系統進程中除開mail、使用者驗證和cron訊息之外的進程產生的訊息層級的日誌指定為RemoteLogs模板:
*.info,mail.none,authpriv.none,cron.none ?RemoteLogs
如果我們想要將所有從遠程用戶端接受到的訊息寫入到一個以它們的IP地址命名的單個檔案中,可以使用以下的模板。在此我們為該模板賦予了“IpTemplate”名稱。
$template IpTemplate,"/var/log/%FROMHOST-IP%.log"
*.* ?IpTemplate
& ~
在我們啟用rsyslog守護進程並編輯好設定檔之後,需要重啟該守護進程。
在 Debian,Ubuntu 或 CentOS/RHEL 6中:
$ sudo service rsyslog restart
在 Fedora 或 CentOS/RHEL 7中:
$ sudo systemctl restart rsyslog
我們可以通過netstat命令來驗證rsyslog守護進程是否正常工作。
$ sudo netstat -tulpn | grep rsyslog
在UDP監聽連接埠下工作的rsyslog守護進程會有類似下面的輸出。
udp 0 0 0.0.0.0:514 0.0.0.0:* 551/rsyslogd
udp6 0 0 :::514 :::* 551/rsyslogd
如果rsyslog守護進程被設定在TCP串連連接埠,那麼應該有類似下面所示的輸出。
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 1891/rsyslogd
tcp6 0 0 :::514 :::* LISTEN 1891/rsyslogd
發送Windows日誌到一個遠端rsyslog伺服器
要將一個Windows用戶端的日誌訊息轉寄到我們的rsyslog伺服器,需要一個安裝 Windows syslog 代理。當然,有許多的syslog代理可以在windows上運行,在此我們可以使用一個自由軟體程式 Datagram SyslogAgent.
在下載安裝該syslog代理後,需要將其配置為作為服務運行。指定使用何種協議來發送資料,以及遠程rsyslog伺服器的IP地址和連接埠,最後指定應該傳輸的事件記錄類型,如下所示。
在我們完成所有的這些配置之後,我們就可以啟動該服務並且在中央rsyslog伺服器中使用命令列工具tail -f來查看記錄檔了。
總結
通過建立一個可以收集本地和遠程主機的中央rsyslog伺服器,我們可以更好地瞭解在這些系統內部究竟發生著什麼,而且可以更加容易地調試它們的問題,是否在它們之間有任何延遲或崩潰存在。
CentOS上配置rsyslog用戶端用以遠程記錄日誌
rsyslog是一個開源工具,被廣泛用於Linux系統以通過TCP/UDP協議轉寄或接收日誌訊息。rsyslog守護進程可以被配置成兩種環境,一種是配置成日誌收集伺服器,rsyslog進程可以從網路中收集其它主機上的日誌資料,這些主機會將日誌配置為發送到另外的遠程伺服器。rsyslog的另外一個用法,就是可以配置為用戶端,用來過濾和發送內部日誌訊息到本地檔案夾(如/var/log)或一台可以路由到的遠程rsyslog伺服器上。
假定你的網路中已經有一台已經配置好並啟動的rsyslog伺服器,本指南將為你展示如何來設定CentOS系統將其內部日誌訊息路由到一台遠程rsyslog伺服器上。這將大大改善你的系統磁碟空間的使用,尤其是當你還沒有一個用於/var目錄的獨立的大分區。
步驟一: 安裝Rsyslog守護進程
在CentOS 6和7上,rsyslog守護進程已經預先安裝了。要驗證rsyslog是否已經安裝到你的CentOS系統上,請執行如下命令:
# rpm -qa | grep rsyslog
# rsyslogd -v
如果處於某種原因,rsyslog守護進程沒有出現在你的系統中,請使用以下命令來安裝:
# yum install rsyslog
步驟二: 配置Rsyslog守護進程為用戶端
接下來的步驟,是要將你的CentOS機器轉變成rsyslog用戶端,將其所有內部日誌訊息發送到遠程中央Log Service器上。
要實現該功能,請使用你喜愛的文字編輯器開啟位於/etc路徑下的rsyslog主設定檔:
# nano /etc/rsyslog.conf
開啟檔案用於編輯後,你需要添加以下聲明到檔案底部。將IP地址替換為你的遠程rsyslog伺服器的IP地址。
*.* @192.168.1.25:514
上面的聲明告訴rsyslog守護進程,將系統上各個裝置的各種日誌訊息路由到遠程rsyslog伺服器(192.168.1.25)的UDP連接埠514。
如果出於某種原因,你需要更為可靠的協議,如TCP,而rsyslog伺服器也被配置為監聽TCP串連,你必須在遠程主機的IP地址前添加一個額外的@字元,像下面這樣:
*.* @@192.168.1.25:514
注意,你也可以將rsyslog伺服器的IP地址替換成它的主機名稱(FQDN)。
如果你只想要轉寄伺服器上的指定裝置的日誌訊息,比如說核心裝置,那麼你可以在rsyslog設定檔中使用以下聲明。
kern.* @192.168.1.25:514
修改設定檔後,你需要重啟進程以啟用修改:
CentOS 7:
# systemctl restart rsyslog.service
CentOS 6:
# service rsyslog restart
非 syslog 日誌的轉寄
在另外一種環境中,讓我們假定你已經在機器上安裝了一個名為“foobar”的應用程式,它會在/var/log下產生foobar.log記錄檔。現在,你想要將它的日誌定向到rsyslog伺服器,這可以通過像下面這樣在rsyslog設定檔中載入imfile模組來實現。
首先,載入imfile模組,這隻需做一次。
module(load="imfile" PollingInterval="5")
然後,指定記錄檔的路徑以便imfile模組可以檢測到:
input(type="imfile"
File="/var/log/foobar.log"
Tag="foobar"
Severity="error"
Facility="local7")
最後,定向local7裝置到遠程rsyslog伺服器:
local7.* @192.168.1.25:514
別忘了重啟rsyslog進程哦!
步驟三: 讓Rsyslog進程自動啟動
要讓rsyslog用戶端在每次系統重啟後自動啟動,請運行以下命令:
CentOS 7:
# systemctl enable rsyslog.service
CentOS 6:
# chkconfig rsyslog on
小結
在本教程中,我示範了如何將CentOS系統轉變成rsyslog用戶端以強制它發送日誌訊息到遠程rsyslog伺服器。這裡我假定rsyslog用戶端和伺服器之間的串連是安全的(如,在有防火牆保護的公司網路中)。不管在任何情況下,都不要配置rsyslog用戶端將日誌訊息通過不安全的網路轉寄,或者,特別是通過互連網轉寄,因為syslog協議是一個明文協議。要進行安全傳輸,可以考慮使用TLS/SSL來加密日誌訊息的傳輸。