Java 从多个应用程序/进程记录到单个日志文件

Java 从多个应用程序/进程记录到单个日志文件,java,unix,log4j,Java,Unix,Log4j,我们的应用服务器(weblogic)都使用log4j登录到网络共享上的同一文件。除此之外,托管服务器中的所有web应用程序都将错误记录到common error.log。我无法想象这是一个好主意,但我想听听一些专业人士的意见。我知道每个web应用程序都有自己的类加载器,因此任何线程同步都只发生在应用程序内。那么,当多个进程开始在单个日志文件上聚合时会发生什么情况呢?我们可以期望分散的日志语句吗?性能问题?多个web应用程序登录到一个公共日志文件怎么样?环境是Solaris。没有对文件的同步写入访

我们的应用服务器(weblogic)都使用log4j登录到网络共享上的同一文件。除此之外,托管服务器中的所有web应用程序都将错误记录到common error.log。我无法想象这是一个好主意,但我想听听一些专业人士的意见。我知道每个web应用程序都有自己的类加载器,因此任何线程同步都只发生在应用程序内。那么,当多个进程开始在单个日志文件上聚合时会发生什么情况呢?我们可以期望分散的日志语句吗?性能问题?多个web应用程序登录到一个公共日志文件怎么样?环境是Solaris。

没有对文件的同步写入访问权通常是个坏主意,当然还有糟糕的编程实践。唯一可行的情况是在本地计算机上对文件进行追加—每个人都只是在文件末尾添加行

但是,由于您的文件位于网络共享上,它可能很快就会变成垃圾。您没有说明使用的是哪个分布式文件系统,但对于NFS,您可以在open(2)手册页上找到以下说明:

O_追加 文件以附加模式打开。在每次写入()之前,文件偏移量 位于文件的末尾, 就好像是lseek()。你可能会导致 删除NFS文件系统上损坏的文件 如果多个进程追加数据 一次把文件归档。这是因为NFS 不支持附加到文件, 因此,客户端内核必须模拟 没有比赛是不行的 条件


当然,这是C语言,但由于Java是用C语言实现的,所以它做得再好不过了(至少在系统调用方面是这样:-)。

我们使用org.apache.log4j.net.SyslogAppender使用syslog登录到一台机器上,它对我们来说工作得很好。我建议将其作为替代方案。

这看起来是一个非常糟糕的主意(损坏的日志、给定日志项来源的不确定性是我想到的两个原因)。如果您在Weblogic中像这样使用Log4j,我建议您这样做。这将允许您为整个应用程序服务器使用一个文件,而不会出现任何问题

同步日志写入的建议对我来说毫无意义,因为当应用程序服务器中的所有应用程序写入日志时,您基本上会阻止它们。如果日志记录频繁,那么会大大降低速度


对于多个应用程序服务器,如果希望将它们全部合并,则需要使用基于文件的日志记录以外的内容。有几种方法可以做到这一点,一种是登录到不同的文件,并使用不同的流程将它们组合起来,但更好的选择可能是使用基于网络的日志存储库,使用Log4j的SocketAppender或其他一些方法(nathan提到SyslogAppender,如果您想要一个Syslog,这很好)以确保文件访问不会损坏。

最好的情况是,您对日志文件资源的同步访问可能会出现性能问题。最糟糕的情况是你提到的一些场景

我会问两个问题:a)这个配置的预期目标是什么,b)你能找到更好的技术解决方案来实现这个目标吗


我的猜测是,您有一个系统管理员想要获取“系统的单个日志文件”。该文件被抛出到网络共享中,以便于获取。对于这个目标,更好的答案可能是多个文件,每个系统都有本地文件,类似于一个好的监视器。

如果可能的话,为每个实例使用不同的文件。这将以最少的努力得到最好的结果

log4j的logback替代方案对其日志编写器有一个谨慎的模式,它显式地跳转,以确保在文件末尾写入新内容。我认为这对网络共享不起作用


如果您必须有一个中央日志记录位置,那么考虑设置一个服务器接受日志事件并将其写入相应的文件。这将确保实际上只有一个进程访问文件系统,并让JVM在同步等方面尽其所能提供帮助。

在logback中将安全地处理可能位于不同主机上的多个JVM,这些JVM将写入同一网络共享文件。它甚至可以处理暂时的网络故障。对于少数节点(比如4个或更少),性能应该是可以接受的。对于5个或5个以上的节点,您可能会注意到性能下降

我们需要从运行同一应用程序的所有托管服务器生成一个文件。我们开发了一个java日志服务器,它打开一个端口并侦听日志事件。我们使用将日志事件写入同一端口,并创建了一个文件

您是否经历过任何实际的日志损坏?如果答案是否定的,我会很惊讶,但是我无法想象你为什么要问这个问题。我知道还没有日志损坏。我这样问是因为我不敢相信他们是这样设置的,我希望得到一些反馈来证实我的怀疑;这更像是巧合。有一些人提到,对于单个日志文件,正确的技术是使用网络日志服务,或者应用程序的服务器日志服务进行每服务器日志记录。我相信这是NFS,但他们不允许我靠近服务器。那么,同一服务器中的多个web应用程序登录到同一个文件呢?这将是一个进程,一个进程,多个线程,这仍然是一样的。另外,不同的web应用程序不是在不同的过程中启动的吗?不管怎样,这有机会像我回答的开头一样起作用。但依赖于此是个坏主意。一台服务器的所有web应用程序都在同一个进程中运行。好的,所以它在Unix级别上是安全的,但是仍然可以得到分散的日志记录。分散的日志记录是肯定的,可能会工作。最好在您的环境中进行测试。如果它在一段时间内起作用,它可能会起作用。好建议。伊玛格