系统日志IP范围使用`rsyslog`的特定文件

我有许多Cisco / JunOS路由器和交换机,它们将日志发送到使用rsyslogd Debian服务器。

如何configurationrsyslogd根据源IP地址将这些路由器/交换机日志发送到特定的文件? 我不想用这些条目来污染一般的系统日志。

例如:

  • 在芝加哥的所有路由器(源IP块:172.17.25.0/24)只logging到/var/log/net/chicago.log
  • 在达拉斯的所有路由器(源IP块172.17.27.0/24)只logging到/var/log/net/dallas.log
  • 删除所有APF-3-RCV_UNSUPP_MSG消息而不logging它们
  • 将日志172.17.4.4发送到名为/var/log/net/firewall.log的文件
  • 使用UDP端口514将防火墙日志转发到10.14.12.12

最后,这些日志应该每天轮换最多30天并压缩。


注:我正在回答我自己的问题

rsyslogdconfiguration

/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.confconfiguration的其余部分; 因此我不会在/var/log/messages看到路由器系统日志条目。

触摸所有系统日志文件:

  • touch /var/log/net/chicago.log
  • touch /var/log/net/dallas.log
  • touch /var/log/net/firewall.log

使用/etc/init.d/rsyslogd restart启动rsyslogd

日志旋转

/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 } 

另外,我在rsyslog上find了这个可以作为将来引用某人的wiki。

http://www.rsyslog.com/storing-messages-from-a-remote-system-into-a-specific-file/