我有许多 Cisco / JunOS 路由器和交换机,它们将日志发送到使用 的 Debian 服务器rsyslogd
。
如何配置rsyslogd
根据源 IP 地址将这些路由器/交换机日志发送到特定文件?我不想让这些条目污染一般系统日志。
例如:
- 芝加哥的所有路由器(源 IP 块:172.17.25.0/24)仅登录
/var/log/net/chicago.log
。 - 达拉斯的所有路由器(源 IP 块 172.17.27.0/24)仅登录
/var/log/net/dallas.log
。 - 删除所有
APF-3-RCV_UNSUPP_MSG
消息而不记录 - 将 172.17.4.4 的日志发送到名为
/var/log/net/firewall.log
- 使用 UDP 端口 514 将防火墙日志转发到 10.14.12.12
最后,这些日志应该每天轮换一次,最多 30 天,然后进行压缩。
注意:我是回答我自己的问题
答案1
rsyslogd
配置
在/etc/rsyslogd.conf
# provides remote UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# If logging to an NFS mount, use these settings...
# "OMFileFlushOnTXEnd off" avoids fsync on every write...
# mount -o hard,rsize=32768,wsize=32768,noacl,noatime,nodiratime -t nfs
$OMFileIOBufferSize 768k
$OMFileAsyncWriting on
$OMFileFlushOnTXEnd off
$OMFileFlushInterval 10
$MainMsgQueueSize 100000
# kill all INTF-FLAP messages...
if $msg contains 'INTF-FLAP' then /dev/null
&~
## Cisco ACS Accounting...
if ($fromhost-ip=='172.17.16.20') and ($programname == 'CSCOacs_TACACS_Accounting') then /var/log/tacacs_acct.log
&~
## CiscoACS 5.4 TACACS Authentication
if ($fromhost-ip=='172.17.16.20') and ($programname == 'CSCOacs_Passed_Authentications') then /var/log/tacacs_auth.log
&~
# Logging for Chicago issues...
if $fromhost-ip startswith '172.17.25' then /var/log/net/chicago.log
& ~
# Logging for Dallas issues...
if $fromhost-ip startswith '172.17.27' then /var/log/net/dallas.log
& ~
# Logging for firewall...
if $fromhost-ip=='172.17.4.4' then @10.14.12.12
if $fromhost-ip=='172.17.4.4' then /var/log/net/firewall.log
& ~
每个&~
条目都会阻止其余配置的失效rsyslog.conf
;因此我不会在中看到路由器系统日志条目/var/log/messages
。
触碰所有系统日志文件:
touch /var/log/net/chicago.log
touch /var/log/net/dallas.log
touch /var/log/net/firewall.log
重新rsyslogd
启动/etc/init.d/rsyslogd restart
日志轮换
在/etc/logrotate.d/rsyslog
/var/log/net/*.log
{
copytruncate
rotate 30
daily
missingok
dateext
notifempty
delaycompress
create root 664 root root
compress
maxage 31
sharedscripts
lastaction
# RHEL: Use "/sbin/service rsyslog restart"
# Debian / Ubuntu: Use "invoke-rc.d rsyslog reload > /dev/null"
invoke-rc.d rsyslog reload > /dev/null
endscript
}
答案2
另外,我在 rsyslog wiki 上找到了这个,可以作为某些人将来的参考。
http://www.rsyslog.com/storing-messages-from-a-remote-system-into-a-specific-file/