Apache-Httpd

我可以通過 VirtualHost 在 rsyslog 日誌伺服器上對負載平衡的 apache http 日誌進行分組嗎?

  • June 29, 2020

我有一組負載平衡的應用程序伺服器 (app1-app4),用於將多個網站記錄到單個日誌伺服器 (log1)。我希望日誌伺服器上的日誌按虛擬主機分組,這樣我可以看到每個虛擬主機都可以獲得一個日誌。

目前,我讓我的 apache 以 VirutalHost 作為前導欄位將日誌發送到我的 rsyslog 伺服器,例如:

LogFormat "%V %h %l %{USERID}e %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" \"%{Cookie}n\""  combinedcookie
CustomLog "|/usr/bin/logger --size 8192 -t httpd -p local6.info" combinedcookie

在每個應用伺服器上創建組合的本地日誌,例如:

www.example.com 190.120.94.32 - - [19/Jun/2020:14:47:05 -0400] "GET /help/ HTTP/1.1" 200 6621 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36" "*cookie*"
fubar.pro 177.27.44.23 - guest [19/Jun/2020:14:52:06 -0400] "GET /login HTTP/1.1" 200 6746 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36" "*cookie*"
www.yadayada.ca 176.82.169.235 - user [19/Jun/2020:14:55:04 -0400] "GET / HTTP/1.1" 200 5716 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36" "*cookie*"

日誌伺服器 rsyslog.conf 看起來像:

$template HttpdTmp,"/backup1/logs/www/%HOSTNAME%/%$YEAR%/live_access_log-%$YEAR%%$MONTH%%$DAY%"
$template RawMsgFormat,"%msg:2:4096%\n"
local6.*                -?HttpdTmp;RawMsgFormat

這會創建如下日誌:

/backup1/logs/www/app1/2020/live_access_log-20200619
/backup1/logs/www/app2/2020/live_access_log-20200619
/backup1/logs/www/app3/2020/live_access_log-20200619
/backup1/logs/www/app4/2020/live_access_log-20200619

我想在日誌伺服器上是:

/backup1/logs/www/www.example.com/2020/live_access_log-20200619
/backup1/logs/www/fubar.pro/2020/live_access_log-20200619
/backup1/logs/www/yadayada.ca/2020/live_access_log-20200619

有沒有一些神奇的配置可以用 rsyslog 標籤或類似的東西來完成?或者我可以根據日誌中的第一個單詞(虛擬主機名稱)進行拆分嗎?

(*IP 已隨機分配以保護匿名)

假設字元串www.example.com位於msg屬性的開頭,您希望將%HOSTNAME%文件名模板中的 替換為該值。可能最簡單的屬性替換操作是提取由空格分隔的*欄位。*這有形式

%key:F,delimeter:numfield:options%

其中分隔符是十進制的字元程式碼,即 32 表示空格,欄位從 1 開始表示第一個。看起來你在開頭有一個空格,msg你可能需要選擇第二個欄位,所以使用:

%msg:F,32:2%

因此,對於您的範例,日誌伺服器 rsyslog.conf 將如下所示:

$template SiteTmp,"/backup1/logs/www/%msg:F,32:2%/%$YEAR%/live_access_log-%$YEAR%%$MONTH%%$DAY%"
$template RawMsgFormat,"%msg:2:4096%\n"
local6.*                -?SiteTmp;RawMsgFormat

引用自:https://unix.stackexchange.com/questions/593896