我有一组负载平衡的应用程序服务器(app1-app4),用于多个网站记录到单个日志服务器(log1)。我希望日志服务器上的日志按以下方式分组虚拟主机所以我可以看到可以获得每个虚拟主机的单个日志。
目前,我的 apache 将日志发送到我的 rsyslog 服务器,其中 VirutalHost 作为前导字段,例如:
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 已被随机化以保护匿名)
答案1
假设该字符串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