我正在使用Syslog-NG 3.8作为系统日志服务器接收来自许多不同来源的消息,大约400台服务器(并过滤它们并最终转发到splunk服务器)。
但是,看起来很多邮件在被过滤并转发到splunk实例之前就被“删除”了。
我有一个配置,我在平面文件中过滤之前跟踪“传入”消息,我在那里看不到一些消息(见下面的例子),而我可以在运行tcpdump时成功看到tcp跟踪,这意味着Syslog-NG在“源”机制中“丢弃”消息。
我怀疑这是由于其接口上传入的大量消息,我需要使用缓冲区和特定选项进行一些调整。
这是一个bug的具体例子:
从源机器,如果我做一个小循环每秒发送一个ID递增的消息(所以20,21,22,23,24等):
root@sm1u1050vmo /var/log: for ((i=20;i<100;i++)); do logger -p auth.notice "test auth notice $i" ; sleep 1 ; done
如果我在Syslog-NG(接收器)上拖尾“incoming.log”平面文件,我可以看到很多丢失的消息:
[root@xm1p1034vmo 20]# tail -f incoming.log | grep sm1u1050vmo
Sep 20 12:27:32 sm1u1050vmo root: [ID 702911 auth.notice] test auth notice 28
Sep 20 12:27:34 sm1u1050vmo root: [ID 702911 auth.notice] test auth notice 30
Sep 20 12:27:37 sm1u1050vmo root: [ID 702911 auth.notice] test auth notice 33
Sep 20 12:27:42 sm1u1050vmo root: [ID 702911 auth.notice] test auth notice 38
Sep 20 12:27:43 sm1u1050vmo root: [ID 702911 auth.notice] test auth notice 39
Sep 20 12:27:52 sm1u1050vmo root: [ID 702911 auth.notice] test auth notice 48
我们可以清楚地看到许多消息丢失。
这是我的配置的一小部分,包括选项和来源:
options {
chain_hostnames(no);
log_msg_size(8192);
time_reopen(2);
create_dirs(yes);
use_dns(yes);
keep_hostname(yes);
stats_freq(3600);
flush_lines(1);
log_fifo_size(1000);
};
使用的来源:
source s_EXTERNAL {
network(transport("udp") log-fetch-limit(500));
};
“本地副本”目标用于在过滤之前跟踪这些传入消息:
destination d_INCOMING_ALL
{
file("/app/syslog-ng/logs/${YEAR}/${MONTH}/${DAY}/incoming.log" create-dirs(yes));
};
请注意,我目前正尝试在源代码中使用so-rcvbuf()等选项(同时调整内核参数rmem_max)。它是16Mb,我把它增加到64M,但它现在没有改变任何东西。运行netstat -us时,我仍然可以看到RcvbufErrors和数据包接收错误增加
有什么提示吗?
谢谢
我会告诉你一个UDP笑话,但你可能不会得到它。说真的,UDP无法保证到达。在每端将协议更改为TCP,您应该设置。除了协议之外,如果您的系统以每秒1的速率丢弃消息,您的网络上可能存在配置问题,或者它只是过载。