对于一个网站服务器而言, 其磁盘操作应该是越少越好的. 尤其是一个高负载的服务器, 如果每分钟要处理成千上万个页面请求, 就意味着要记录相当数目的 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 服务器里了.
🙂