Linux 上配置 syslog 伺服器過程詳解

Linux中國發表於2015-03-13

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客戶端來執行以下三個任務之一:

  1. 儲存日誌訊息到一個本地檔案;
  2. 通過TCP/UDP將訊息路由到遠端的syslog伺服器中;
  3. 將其傳送到一個標準輸出中,例如控制檯。

在 rsyslog裡, syslog的配置是基於以下模式進行結構化的。

[facility-level].[severity-level]  [destination]

在Linux中配置Rsyslog

在我們理解syslog之後,現在可以通過rsyslog來將一個Linux伺服器配置為一箇中心syslog伺服器了,另外我們也將看到如何在一個Windows的系統上配置一個syslog客戶端來傳送內部日誌到該syslog伺服器中。

第1步: 初始化系統需求

要將linux主機設定為一箇中央日誌伺服器, 我們需要建立一個分離的 /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伺服器,我們可以更好地瞭解在這些系統內部究竟發生著什麼,而且可以更加容易地除錯它們的問題,是否在它們之間有任何延遲或崩潰存在。

相關文章