Azure Java Tomcat日志记录

Azure Java Tomcat日志记录,java,tomcat,logging,azure,azure-diagnostics,Java,Tomcat,Logging,Azure,Azure Diagnostics,我计划将以前创建的Java web应用程序迁移到Azure。应用程序以前使用log4j作为应用程序级日志,这些日志保存在本地创建的文件中。问题是,由于Azure角色具有多个实例,我必须收集和聚合这些日志,并确保它们存储在持久性存储中,而不是虚拟机硬盘驱动器中 日志记录是应用程序的一个关键组件,但它不能减慢实际工作。我考虑过多种选择,我很想知道最佳做法是什么,这是考虑到存储时间和后期处理的安全性、日志一致性和性能的最佳解决方案。以下是选项列表: 将log4j与自定义的Appender一起使用,以

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

日志记录是应用程序的一个关键组件,但它不能减慢实际工作。我考虑过多种选择,我很想知道最佳做法是什么,这是考虑到存储时间和后期处理的安全性、日志一致性和性能的最佳解决方案。以下是选项列表:

  • 将log4j与自定义的
    Appender
    一起使用,以在Azure SQL中存储信息
  • 将log4j与自定义的
    Appender
    一起使用,将信息存储在Azure表存储中
  • 编写一个附加工具,将数据从本地硬盘传输到上述任一持久存储
对于这个问题,Java是否有其他方法或完整的解决方案?
考虑到上述标准,上述哪项最合适?

目前没有现成的解决方案,但是。。。一个用于表存储的自定义附加器是有意义的,因为您可以用与诊断类似的方式(性能计数器等)查询日志

唯一需要考虑的是,如果您正在大量编写日志语句(比如每秒数百次)。按照这种速度,您将开始注意到每月账单上显示的交易成本。每10000便士,每秒100便士,每个实例大约250美元。如果您有多个实例,那么成本会随之增加。使用SQLAzure,您将不会有事务成本,但会有更高的存储成本

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


关于Java和诊断设置,刚刚发布的持久性系统中有一个新的例子。一旦这个答案上线,我会用链接更新它。另外,请看一看,它通过使用设置诊断的外部.net exe来实现Tomcat日志记录(和相关解析),如下面的文章所述。

请访问我的博客并下载文档。在本文档中,您可以查找错误日志解决方案的“Tomcat解决方案诊断”一章。这个文档写得很早,但是您肯定可以使用这个方法在Tomcat中生成任何类型的基于Java的日志(log4j,sure)并直接查看

第6章:Tomcat解决方案诊断

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

在任何有自定义应用程序(如java.exe、php.exe、python等)的场景中,我建议直接在“本地存储”文件夹中创建日志文件,然后在Worker角色(WorkerRole.cs)中初始化Azure Diagnostics,以将这些自定义日志文件直接从Azure VM导出到Azure Blob存储

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


使用Azure Diagnostics并将日志发送到Azure blob将比您描述的任何其他方法都更便宜、更健壮

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

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

首先,我创建了一个实体类来存储在Azure表中,名为
LogEntity
,它扩展了
com.microsoft.windowsazure.services.table.client.TableServiceEntity

接下来,我编写了扩展
org.apache.log4j.AppenderSkeleton
的appender,其中包含
java.util.List

从重写的方法
protectedvoidappend(loggingeevent事件)
中,我只将其添加到此集合,然后创建一个线程,定期清空此列表并将数据写入Azure表

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

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

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

这样就不会产生交易成本和成本 开发特殊Log4j追加器的成本。。。它可能成为一种更便宜的替代品

谢谢 吉万


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

在从Eclipse项目部署时,没有WorkerRole.cs。只需启动脚本。您可以创建diagnostics.wadcfg并配置计时器和diag设置,然后放入角色根文件夹。当Azure角色启动时,它将在根文件夹中查找diagnostics.wadcfg,它将加载配置并启动诊断