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

时间:2010-04-07 21:32:20

标签: java unix log4j

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

7 个答案:

答案 0 :(得分:10)

prudent mode中,logback将安全地处理可能在写入同一网络共享文件的不同主机上的多个JVM。它甚至可以处理临时网络故障。对于少数节点,例如4或更少的节点,性能应该是完全可接受的对于5个或更多节点,所有记录都很重,您可能会注意到性能受到影

答案 1 :(得分:8)

对于没有同步对文件的写访问权限以及当然糟糕的编程习惯,这是一个非常糟糕的主意。它可能工作的唯一情况是附加到本地机器上的文件 - 每个人只是在文件末尾添加行。

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

  

O_APPEND       该文件以追加模式打开。在每次write()之前,文件偏移量   位于文件的末尾,   好像用lseek()。 O_APPEND可能会领先   损坏NFS文件系统上的文件   如果多个进程附加数据   一次到一个文件。这是因为NFS   不支持附加到文件,   所以客户端内核必须模拟   它,没有种族就无法完成   条件。

当然这是C,但由于Java是用C实现的,所以它不能做得更好(至少不是系统调用: - ))。

答案 2 :(得分:5)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

同步日志写入的建议对我来说毫无意义,因为在写日志时你基本上会阻止app服务器中的所有应用程序。如果记录频繁,那将大大减慢一切。

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

答案 5 :(得分:1)

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

log4j的logback替代方法对其日志编写器采用谨慎模式,该模式明确跳过箍以确保在文件末尾写入新内容。我不认为那会对网络共享起作用。

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

答案 6 :(得分:0)

最好的情况我会想象您对日志文件资源的同步访问存在潜在的性能问题。最糟糕的情况是你提到的一些场景。

我会问两个Q:a)这个配置的目标是什么?b)你能找到一个更好的技术解决方案来实现这个目标。

我的猜测是你有一个系统管理员想要获得一个“系统的单一日志文件”。该文件将被抛出在网络共享上,以便于访问。目标的更好答案可能是多个文件,每个系统都是本地的,对于一个漂亮的监视器,可能是http://www.splunk.com/