用 rsyslog 做专属的 log 服务器


对于一个网站服务器而言, 其磁盘操作应该是越少越好的. 尤其是一个高负载的服务器, 如果每分钟要处理成千上万个页面请求, 就意味着要记录相当数目的 log 条目. 磁盘IO是最慢的, 不是吗? 这种情况下很常见的一个做法就是将 log 写到另一台专属的 log 服务器以减轻负担.

比较”现代”的 Linux 系统里, rsyslog 基本已经是标准配置. 所以用一台 Linux 服务器作为另一台 Linux 服务器的 log 服务器并不需要什么额外的软件.

以运行 apache2 服务的网站服务器为例, 将 apache2 log 输出的配置基本如下:

1, /etc/rsyslog.conf

[…]

#避免 local7 被 syslog 重复记录
*.*;auth,authpriv,local7.none  -/var/log/syslog

#将 local7 转送到 log 服务器
local7.* @SERVER_IP:514

2, /etc/apache2/apache2.conf

[…]

ErrorLog “|/usr/bin/logger -t apache2err -p local7.warn”
CustomLog “|/usr/bin/logger -t apache2acc -p local7.info” combined

专属 log 服务器一端配置如下:

1, /etc/rsyslog.conf

[…]

#开启 UDP 协议以及端口
$ModLoad imudp
$UDPServerAddress SERVER_IP
$UDPServerRun 514

[…]

#按照 tag 的不同对送来的 log 进行分拣
$template Apache2Access, “/var/log/%fromhost-ip%/apache2/access.log”
$template Apache2Error, “/var/log/%fromhost-ip%/apache2/error.log”
$template Apache2VHosts, “/var/log/%fromhost-ip%/apache2/vhosts.log”

if $syslogfacility-text == ‘local7’ and $programname == ‘apache2acc’ then ?Apache2Access
if $syslogfacility-text == ‘local7’ and $programname == ‘apache2acc’ then ~

if $syslogfacility-text == ‘local7’ and $programname == ‘apache2err’ then ?Apache2Error
if $syslogfacility-text == ‘local7’ and $programname == ‘apache2err’ then ~

if $syslogfacility-text == ‘local7’ and $programname == ‘apache2vh’ then ?Apache2VHosts
if $syslogfacility-text == ‘local7’ and $programname == ‘apache2vh’ then ~

这样两端的 rsyslog 服务以及 apache2 服务重新启动后, apache2 的 log 就会出现在 log 服务器里了.

🙂