这是我的 rsyslog.conf(/etc/rsyslog.d/ 文件夹中没有任何内容):
#### MODULES ####
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
#### GLOBAL DIRECTIVES ####
# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf
#### RULES ####
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg *
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
# SEND ALL THE MESSAGES TO CENTRAL LOGSTASH SERVER
#
*.* @10.38.105.18:5000
重新启动rsyslog服务后,我尝试以下操作进行测试:
logger "Host1 kernel: device eth0 left promiscuous mode"
然后在 logstash 服务器端 (10.38.105.18) 上运行 tcpdump,查看是否有什么事情发生(10.36.52.81 是发送日志的服务器):
[~] # tcpdump src host 10.36.52.81 -nn -XXX
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
没有什么。
当我通过 nc 发送数据时:
[~] # echo -n "Host1 kernel: device eth0 left promiscuous mode" | nc -4u -w1 10.38.105.18 5000
我可以看到它经过了:
03:04:19.521433 IP 10.36.52.81.42159 > 10.38.105.18.5000: UDP, length 47
0x0000: 0050 56a6 4600 0026 981c bd42 0800 4500 .PV.F..&...B..E.
0x0010: 004b 9560 4000 3e11 f594 0a24 3451 0a26 .K.`@.>....$4Q.&
0x0020: 6912 a4af 1388 0037 01da 486f 7374 3120 i......7..Host1.
0x0030: 6b65 726e 656c 3a20 6465 7669 6365 2065 kernel:.device.e
0x0040: 7468 3020 6c65 6674 2070 726f 6d69 7363 th0.left.promisc
0x0050: 756f 7573 206d 6f64 65 uous.mode
所以,这意味着路径上没有障碍物。我做错了什么?
更新:
在客户端执行了 tcpdump,看起来客户端正在将日志发送到 Logstash:
03:30:20.073608 IP 10.36.52.81.39653 > 10.38.105.18.5000: UDP, length 88
0x0000: 001b 1700 0125 0050 56a6 6b5e 0800 4500 .....%.PV.k^..E.
0x0010: 0074 0000 4000 4011 88cc 0a24 3451 0a26 .t..@.@....$4Q.&
0x0020: 6912 9ae5 1388 0060 b21e 3c31 333e 4465 i......`..<13>De
0x0030: 6320 2031 2030 333a 3330 3a32 3020 6d73 c..1.03:30:20.ms
0x0040: 7070 3170 6573 6c6f 6730 3031 2072 6f6f pp1peslog001.roo
0x0050: 743a 2048 6f73 7431 206b 6572 6e65 6c3a t:.Host1.kernel:
0x0060: 2064 6576 6963 6520 6574 6830 206c 6566 .device.eth0.lef
0x0070: 7420 7072 6f6d 6973 6375 6f75 7320 6d6f t.promiscuous.mo
0x0080: 6465 de
中间确实有防火墙,但是为什么我通过“logger”命令发送消息时,logstash 端的 tcpdump 不显示数据包,而我通过 netcat 发送时却显示数据包?我很困惑。
答案1
我不能肯定地说为什么你的配置不起作用,但我使用 rsyslog 向 logstash 发送消息,没有遇到任何问题。如果你可以使用 nc 向 logstash 发送流量,并且 logstash 设置为在 UDP 和 TCP 上接收日志,并且你使用相同的端口,那么这应该可以工作。
您能简化设置吗?您说两台机器之间有防火墙,您能出于测试目的禁用它或在没有防火墙的虚拟机上重现吗?
在我的设置中,我使用以下配置,这应该是一种非常可靠的发送日志的方式。我建议使用 TCP(即 @@ 而不是 @),因为它应该比 UDP 更可靠,并且如果使用以下配置发送失败,消息将在磁盘和内存中排队,因此您可以在不丢失消息的情况下修复它:
# start forwarding rule 2
$ActionQueueType LinkedList # use asynchronous processing
$ActionQueueFileName logstash # set file name, also enables disk mode
$ActionResumeRetryCount -1 # infinite retries on insert failure
$ActionResumeInterval 10 # Attempt resuming after 10 seconds
$ActionQueueSaveOnShutdown on # save in-memory data if rsyslog shuts down
$ActionQueueMaxDiskSpace 200M #Limit the amount of space used on disk to 200M
$ActionQueueSize 20000 # Limit the amount of messages to queue in memory to 20000, average size is 512 bytes, so shouldn't be greater than 10M
*.* @@logstash:5114;RSYSLOG_SyslogProtocol23Format # end forwarding rule 2
请记住,如果您使用 UDP 发送并且消息没有发送成功,则发送者不会知道并且会一直丢失消息,直到有人发现该问题。