我正在设置 syslog-ng 服务器来接受来自各种来源的日志。一般设置如下:
Device1
Device2 Syslog1
Device3 --> Load balancer --> Syslog2 --> Shared SAN storage
Device4 Syslog3
Device5
我使用的是 514/udp,通过此设置,我应该可以轻松实现 HA,并能够循环调度和分散负载。我担心的是后端如何共享和写入存储。理想情况下,我希望每个设备当天都有一个 deviceX.log 文件。如果 syslog1 从设备 1 获取一个大日志文件,并且仍在写入 device1.log,而 syslog2 从设备 1 获取一个小日志文件并开始尝试同时写入同一个文件,会发生什么情况?
我读到过,在 Linux 中,如果你附加文件但不以“写入”模式打开它,则永远不会收到写保护错误。我不确定 syslog 是如何做到这一点的。
我的问题是:
- 您推荐使用什么共享文件系统供 SAN 在系统日志盒之间共享?
- 有没有更好的方法将多个 syslog 服务器合并到 1 个文件中?如果 syslog 只是附加,那么应该没问题。
如有任何建议,我们将不胜感激。提前致谢。
答案1
不确定您使用什么负载均衡器,但我建议您在负载均衡器上配置某种“粘性”,以便 Device1 日志始终被定向到 Syslog1 等。
这将解决您对日志文件的担忧,但也会避免我认为同样严重的问题。
我对您的示例的担心是,如果有大量日志条目从 Device1 传递到 Syslog1,然后只有较少数量的日志条目从 Device1 传递到 Syslog2,则 Syslog2 可能会将后续的系统日志消息无序插入到您的日志文件中。
答案2
我发现任何类型的集群文件系统(例如 GlusterFS)都可以很好地用于多台服务器写入一个文件。但是由于我拥有的 SAN 基础设施,这是不可能的。因此我最终每天为每个 syslog 集群写入一个文件。
Syslog1 --> 2012-07-29-sys01.log
Syslog2 --> 2012-07-29-sys02.log
然后我使用 logmerge 脚本和 cronjob 合并文件并按正确时间排序。下面的 cron job 在文件写入完成后的第二天运行。
/local/bin/logmerge -f /logs/-sys*.log
date -d yesterday +\%Y-\%m-\%d
| gzip -9 -c > /logs/.log.gzdate -d yesterday +\%Y-\%m-\%d
&& rm -fdate -d yesterday +\%Y-\%m-\%d
/logs/-sys*.log