首页 > 解决方案 > Syslog-NG 中丢弃的消息 - 缓冲区配置?

问题描述

我使用 Syslog-NG 3.8 作为 syslog 服务器接收来自许多不同来源的消息,大约 400 台服务器(& 过滤它们并最终中继到 splunk 服务器)。

但是,看起来许多消息甚至在它们被过滤并转发到 splunk 实例之前就被“丢弃”了。

我有一个配置,我在过滤平面文件之前跟踪“传入”消息,并且我看不到其中的一些消息(参见下面的示例),而在运行 tcpdump 时我可以成功看到 tcp 跟踪,意味着 Syslog-NG 在“源”机制期间“丢弃”消息。

我怀疑这是由于其界面上传入的大量消息,我需要对缓冲区和特定选项进行一些调整。

这是该错误的具体示例:

从源机器,如果我做一个小循环,每秒发送一个 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数据包接收错误增加

请问有什么提示吗?

谢谢

标签: syslogsyslog-ng

解决方案


我会告诉你一个 UDP 笑话,但你可能不会明白。说真的,UDP 不能保证到达。将每端的协议更改为 TCP,您应该已设置好。撇开协议不谈,如果您的系统以每秒 1 条的速度丢弃消息,则您的网络可能存在配置问题,或者只是过载。


推荐阅读