集中式 Java 日志记录

Posted

技术标签:

【中文标题】集中式 Java 日志记录【英文标题】:Centralised Java Logging 【发布时间】:2012-06-21 11:31:24 【问题描述】:

我正在寻找一种方法来集中分布式软件(用 Java 编写)的日志记录问题,这将非常容易,因为所讨论的系统只有一个服务器。但请记住,将来很可能会运行更多特定服务器的实例(并且需要更多应用程序),必须有类似 Logging-Server 的东西,它处理传入的日志并使支持团队可以访问它们。

现在的情况是,几个 java 应用程序使用 log4j 将其数据写入本地文件,因此如果客户遇到问题,支持团队必须要求提供日志,这并不总是那么容易并且需要很多时间。在服务器故障的情况下,诊断问题没有那么大,因为无论如何都有远程访问,但是即使通过 Logging-Server 监控所有内容仍然很有意义。 p>

当我处理有关“集中式日志记录”的问题时,我发现了另一个 Question(实际上是唯一一个(在这种情况下)可用答案的问题。问题是,所有应用程序都在一个封闭的环境中运行(在一个网络中) ) 并且安全指南不允许与内部软件相关的任何内容离开环境网络。

我还发现了一篇精彩的文章,关于如何implement 这样的 Logging-Server。由于这篇文章是在 2001 年写的,我会认为有人可能已经解决了这个特定的问题。但我的搜索结果一无所获。

我的问题:是否有一个日志框架来处理网络上的日志记录,其中包含一个支持团队可以访问的集中式服务器?

规格:

可用性 服务器必须由我们运行。 Java 1.5 兼容性 与异构网络的兼容性。 最佳情况:协议使用 HTTP 发送日志(以避免防火墙问题) 最佳案例:使用 log4j 或 LogBack 或基本上任何实现 slf4j 的东西

没有必要,但很高兴拥有

身份验证和安全性当然是一个问题,但至少可以推迟一段时间(如果它是开放软件,我们会将其扩展到我们的需求OT:我们总是回馈项目 em>)。 数据挖掘和分析对于改进软件非常有帮助,但也可以是外部应用程序。

我最坏的情况是他们没有这样的软件。对于这种情况,我们可能会自己实现。但如果有这样的客户端-服务器应用程序,我将非常感谢不需要做这种特别有问题的工作。

提前致谢

更新:该解决方案必须在多个支持 java 的平台上运行。 (主要是 Windows、Linux、一些 HP Unix)

更新:经过大量研究,我们实际上找到了我们能够获得的解决方案。 clusterlog.net(至少从 2015 年年中开始离线)为分布式软件提供日志服务,并且兼容 log4j 和 logback(兼容 slf4j)。它让我们可以通过应用程序分析每个用户。因此,很容易重现报告的错误(甚至是未报告的错误)。它还通过电子邮件通知我们重要事件,并有一个报告系统,将相同来源的日志汇总为易于访问的格式。几天前,他们在这里部署(完美无瑕)它并且运行良好。

更新(2016 年):这个问题仍然有很多流量,但我提到的网站已经不存在了。

【问题讨论】:

您没有提及您正在运行什么操作系统,或者您是否需要跨平台,但如果您使用的是 *nix,您可能需要查看 syslog appender。如果我没记错的话,还有一个 SMTP 附加程序 - 您可以创建一个内部电子邮件帐户以通过电子邮件接收日志? 我假设您已经考虑过联网的 syslogd 设置? 您也可以登录数据库。 tutorialspoint.com/log4j/log4j_logging_database.htm clusterlog.net 返回一个空页面 【参考方案1】:

您可以将 Log4j 与 SocketAppender 一起使用,因此您必须将服务器部分编写为 LogEvent 处理。 见http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/net/SocketAppender.html

【讨论】:

注意,如果双方都使用Log4j,那你就写一点吧。 我想知道是否要编写自己的 Appender 来写入 IRC 频道。 Syslog appender 可能会更好地为我服务。 PS - 我说的是 log4j2。【参考方案2】:

NXLOGLogStashGraylogs2

LogStash + ElasticSearch(+可选 Kibana)

例子:

1) http://logstash.net/docs/1.3.3/tutorials/getting-started-simple

2) http://logstash.net/docs/1.3.3/tutorials/getting-started-centralized

【讨论】:

【参考方案3】:

看看 logFaces,看起来你的规格已经满足了。 http://www.moonlit-software.com/

可用性(检查) 服务器必须由我们运行。 (检查) Java 1.5 兼容性(检查) 与异构网络的兼容性。 (检查) 最佳情况:协议使用 HTTP 发送日志(以避免防火墙问题)(几乎是 TCP/UDP) 最佳案例:使用 log4j 或 LogBack 或基本上任何实现 slf4j 的东西(检查) 身份验证(检查) 数据挖掘和分析(可能通过扩展 api)

【讨论】:

这正是我所需要的......它符合要求;我们得看看能不能负担得起:)【参考方案4】:

Facebook 提供了一个即用型解决方案 - Scribe - 在后台使用 Apache Hadoop。然而,据我所知,大多数公司仍然倾向于为此开发内部系统。大约两年前,我曾在一家这样的公司工作,并在那里处理过日志。我们还使用了 Hadoop。在我们的例子中,我们有以下设置:

我们有一个小型专用机器集群用于日志聚合。 工作人员从生产服务中挖掘日志,然后解析各个行。 然后reducer 将汇总必要的数据并准备报告。

我们感兴趣的报告数量很少且数量固定。在极少数情况下,当我们想要执行不同类型的分析时,我们只需为此添加专门的缩减程序代码,并可选择针对旧日志运行它。

如果您无法提前确定自己感兴趣的分析类型,那么最好将工作人员准备的结构化数据存储在 HBase 或其他一些 NoSQL 数据库 (here, for example, people use Mongo DB) 中。这样您就不需要从原始日志中重新聚合数据,而是能够查询数据存储。

有很多关于这种日志聚合解决方案的好文章,例如using Pig to query the aggregated data。 Pig 允许您使用类似 SQL 的查询来查询基于 Hadoop 的大型数据集。

【讨论】:

以上是关于集中式 Java 日志记录的主要内容,如果未能解决你的问题,请参考以下文章

一个记录到我们后端的 JavaScript 前端日志系统?

linux下syslog-ng日志集中管理服务部署记录

用于多行的 Docker Fluentd 日志记录驱动程序

全网日志集中审计解决方案

elk搭建记录

UNIX 系统日志