![有没有办法限制系统日志](https://linux22.com/image/523782/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E9%99%90%E5%88%B6%E7%B3%BB%E7%BB%9F%E6%97%A5%E5%BF%97.png)
我们使用 Log4J 及其 SyslogAppender 将消息发送到中央 syslog-ng 服务器,所有服务器均在 Unix 机器上运行。
有没有办法(无论是使用 Java 还是 Unix)来限制发送的消息数量,以避免服务器故障也扰乱网络?
我能想到的唯一选择是将日志级别设置得更高,这样实际上发送的消息就会更少,但这并不理想,因为重要的消息可能会在正常运行的机器上被抑制。
我认为在理想世界中,动态变化的水平会很好:如果每秒的消息数量超过某个水平,则阈值就会上升,但与此同时,这听起来有点过度。
有任何想法吗?
谢谢
富有的
答案1
我认为问题是,您是否介意在中央服务器上获取所有日志?您所说的本质上是丢弃消息 - 在这种情况下,您将丢失日志。这样可以吗?如果可以,您已经回答了自己的问题 - 提高调试级别以仅获取您真正关心的消息。
但是,如果您尝试满足带宽限制(例如 Splunk 的月处理限制),则需要编写一个中间服务器来从 syslog 中获取日志并对其进行优先级排序。这并不难,但它与您的用例高度相关。这种方法的一个好处是,这个中间人可以立即将重要日志发送到聚合服务器,并在一天/一个月结束时发送最初未发送的下一个最高优先级日志。这样,您就可以准确填充配额。
如果您添加更具体的要求(例如为什么需要这样做),以及限制日志的含义(重复行?带宽?空间?聚合服务器跟不上?等等),那么您会得到更好的答案。
祝你好运!
答案2
如果您正确使用 log4j,则使用更高的日志级别不会影响导入消息,因为它们应该具有高级别。使用本地轮换在本地记录详细信息。
答案3
我唯一知道的接近这一点的就是配置静音相同的消息,例如,如果一条日志消息重复了 200 次,您可以要求 syslog 记录一次并忽略其他消息,只记录一条消息,说明该消息重复了 199 次以上。限制日志可能会让您丢失日志消息,这是不可取的。
也许您可以在您的服务器和日志服务器之间放置 QOS/流量整形并使用它来控制速度?
答案4
如果像您所说的那样是带宽问题,您甚至可以使用压缩(rsyslog 支持压缩,但我不确定 syslog-ng 是否支持)。此外,如果您不使用日志进行实时警报,您可以编写一个脚本,每隔几秒读取一次本地日志并发送压缩的聚合。
如果您想要分布式解决方案,那么您可以使用上述建议。(节省许多链接上的带宽)。但是,如果您更喜欢更集中的解决方案(带宽浪费略多,因为您必须将无用的日志发送到中间服务器),那么 Redmumba 解决方案要好得多。