在工作中,我们正在构建一个分布式应用程序(可能跨越局域网上的多台机器,可能稍后在WAN + VPN上跨越几个大陆).我们不希望每台机器都有本地日志文件(填满磁盘而无法集中查看),因此我们需要集中通过网络进行日志记录.大多数日志都不重要,因此UDP对他们来说很好,但有些是丢失重要的警报,必须可靠地传递,这意味着TCP.如果日志记录协议过于繁琐,我们担心拥塞网络,或者如果应用程序没有响应,则将应用程序拖到爬网中.
我考虑过的一些可能性是:
系统日志(看起来很完美,但我的老板对此有一种敌意,所以我可能无法选择它).
来自facebook的抄写员(但它似乎有点重量级,每台机器上都有一台服务器 - 并非每条日志消息都需要超级可靠性).
使用像rabbitmq这样的消息队列,可以将多个队列调整到不同级别的事务安全性.
最坏的情况,我可以从头开始写自己的.
你有其他建议吗?您使用了哪些集中式日志记录解决方案,以及它们的运行情况如何?
编辑:我倾向于抄写员,因为它的存储转发设计将正在运行的应用程序与网络延迟分离.但是在努力安装它之后,我发现(1)它不能作为二进制包使用 - 现在这是不可原谅的 - 而且(2)它非常依赖于一个不能作为二进制包提供的库(thrift)!最糟糕的是,它甚至无法正常编译.这不是发布质量代码,即使在开源中也是如此.
我们已经成功地将ZeroMQ用于像您这样的分布式应用程序场景的日志.它非常可靠,速度极快.在使用Spread实现不太成功后,我们转移到了ZeroMQ .在我们的设置中,单个ZeroMQ服务器能够处理来自中高繁忙分布式应用程序的70多种不同日志.它从LAN和Internet接收数据.
如果您需要详细的队列服务器比较,请从Second Life wiki查看此页面.
希望能帮助到你!
最近有几种选择.值得注意的是,Scribe不再维护.Facebook开发了名为Caligraphus的继任者,它不是开源的.这是一个备选列表.
syslog:安装在所有Linux发行版中
Fluentd:基于C + Ruby的轻量级记录器,它将日志作为JSON流处理
Flume:在Cloudera开发,用Java编写,与Hadoop生态系统配合良好
Apache Kafka:在LinkedIn开发的基于拉的架构
Scribe:由Facebook开源,但不再维护
免责声明:我是Fluentd项目的提交者.
其他示例可能很棒,但是我对Syslog-NG感到很幸运。它非常灵活且可配置;尽管拿起它并快速做一些有用的事情很容易。
如果您打算只关注基础架构日志(例如,在系统级别),则Syslog很好.我听说KIWI系统日志服务器是一个很好的,虽然没有自己尝试.另一方面,如果要记录与应用程序相关的内容,系统日志可能不是最佳选择.如果你使用apache日志服务(log4j,log4xxx和其他),那么logFaces将是一个很好的解决方案,因为它专门用于在一个地方聚合多个应用程序.适用于TCP或UDP连接,并具有不错的日志查看器和数据库集成.
披露:我是这个产品的作者.