5

我计划将以前创建的 Java Web 应用程序迁移到 Azure。以前用于log4j应用程序级别日志的应用程序保存在本地创建的文件中。问题是,由于 Azure 角色有多个实例,我必须收集和汇总这些日志,并确保它们存储在持久存储而不是虚拟机硬盘驱动器中。

日志记录是应用程序的关键组件,但它不能减慢实际工作的速度。我考虑了多种选择,我对最佳实践感到好奇,这是考虑到安全性、日志一致性和存储时间和后期处理性能的最佳解决方案。以下是选项列表:

  • 使用带有自定义的 log4jAppender在 Azure SQL 中存储信息。
  • 使用带有自定义的 log4jAppender在 Azure 表存储中存储信息。
  • 编写一个附加工具,将数据从本地硬盘驱动器传输到上述任一持久性存储。

Java有没有其他方法或有针对这个问题的完整解决方案?考虑到上述标准,以上哪一项是最好的?

4

4 回答 4

2

目前还没有开箱即用的解决方案,但是......表存储的自定义附加程序是有意义的,因为您可以以与诊断(性能计数器等)类似的方式查询您的日志。

唯一需要考虑的是,如果您正在大量编写日志语句(例如每秒数百次)。以这个速度,您会开始注意到每月账单上显示的交易成本。以每 10,000 美元和每秒 100 美元计算,每个实例大约需要 250 美元。如果您有多个实例,则成本会从那里上升。使用 SQL Azure,您将没有交易成本,但您将拥有更高的存储成本。

如果您想使用存储传输方法,您可以设置 Windows Azure 诊断程序以监视目录并定期将文件上传到 Blob 存储。唯一的障碍是 Java 不直接支持配置诊断。如果您从 Eclipse 构建项目,则只有一个启动所有内容的脚本文件,因此您需要编写一个小型 .net 应用程序,或使用类似AzureRunMe的东西。如果你正在构建一个 Visual Studio 项目来启动你的 Java 应用程序,那么你可以在没有单独的应用程序的情况下设置诊断。

Persistent Systems 刚刚发布了一篇关于 Java 和诊断设置的博客文章。一旦它上线,我会用一个链接更新这个答案。此外,请查看Cloud Ninja for Java,它通过使用设置诊断的外部 .net exe 实现 Tomcat 日志记录(和相关解析),如即将发布的帖子中所述。

于 2012-05-31T18:19:38.627 回答
1

最后我决定写一个 Log4J Appender。我不需要收集诊断信息,我的主要目标只是以一种易于交换的方式收集日志文件。我的第一个担心是它会减慢应用程序的速度,但是通过只写入内存并且只定期将日志数据写入 Azure 表,它可以完美地工作,而不会进行太多的 API 调用。

以下是我实施的主要步骤:

首先,我创建了一个要存储在 Azure 表中的实体类,称为LogEntityextends com.microsoft.windowsazure.services.table.client.TableServiceEntity

接下来,我编写了扩展org.apache.log4j.AppenderSkeleton包含一个java.util.List<LogEntity>.

从被覆盖的方法protected void append(LoggingEvent event)中,我只添加到此集合中,然后创建了一个线程,该线程定期清空此列表并将数据写入 Azure 表。

最后,我将新创建的添加Appender到我的 log4j 配置文件中。

于 2012-06-27T07:20:36.380 回答
1

请访问我的博客并下载文档。在本文档中,您可以查找“Tomcat 解决方案诊断”一章以获取错误日志解决方案。该文档是很久以前写的,但您确实可以使用此方法在 Tomcat 中生成任何类型的基于 Java 的日志记录(log4j,当然)并直接查看。

第 6 章:Tomcat 解决方案诊断

  • 错误记录
  • 查看日志文件

http://blogs.msdn.com/b/avkashchauhan/archive/2010/10/29/windows-azure-tomcat-solution-accelerator-full-solution-document.aspx

在任何有自定义应用程序(即 java.exe、php.exe、python 等)的情况下,我建议直接在“本地存储”文件夹中创建日志文件,然后在 Worker Role (WorkerRole.cs) 中初始化 Azure 诊断以导出这些自定义日志文件直接从 Azure VM 到 Azure Blob 存储。

此处描述了如何在本地存储上创建自定义日志

与您描述的任何其他方法相比,使用 Azure 诊断并将日志发送到 Azure blob 将是最便宜和强大的。

于 2012-05-31T18:55:54.760 回答
0

另一种选择;

我们能不能继续以标准方式(例如 DailyRollingFileAppender)使用 log4j,只有文件应该在 UNC 路径、VM(IaaS)上创建。这个虚拟机只需要一点磁盘空间,但不需要任何强大的处理能力。因此可以共享一个可用的虚拟机,或者创建一个配置最少的虚拟机,最好在同一个区域和云服务中。

可以通过 RDP/FTP 等方式访问累积的日志文件。

这样一来,就不会产生交易成本和开发特殊 Log4j appender 的成本......它可能会成为一种更便宜的替代方案。

谢谢吉文

PS:我更多地指的是应用程序日志记录,而不是应用程序服务器日志(Weblogic 的 catalina/manager .log 或 .out 文件)

于 2016-01-08T06:50:31.917 回答