我们的应用程序服务器(weblogic)都使用log4jlogin到networking共享上的同一个文件。 最重要的是,我们让一个托pipe服务器中的所有Web应用程序将错误logging到一个常见的error.log中。 我无法想象这是一个好主意,但想听取一些专业人士的意见。 我知道每个Web应用程序都有自己的类加载器,所以任何线程同步只发生在应用程序内。 那么当多个进程开始收敛到单个日志文件时会发生什么? 我们可以期望散布的日志语句? 性能问题? 怎么样多个networking应用程序login到一个通用的日志文件? 环境是Solaris。
这是非常不好的想法,没有同步写访问文件,肯定是不好的编程实践。 唯一可能的情况是在本地机器上附加一个文件 – 每个人只是在文件末尾添加行。
但是,由于您的文件位于网络共享上,因此可能会很快变成垃圾。 您没有告诉您正在使用哪个分布式文件系统,但对于NFS,您可以在open(2)手册页上找到以下说明:
O_APPEND该文件以附加模式打开。 在每个write()之前,文件偏移位于文件的末尾,就像使用lseek()一样。 如果多个进程一次将数据附加到文件,则O_APPEND可能会导致NFS文件系统上的文件损坏。 这是因为NFS不支持附加到文件,所以客户端内核必须模拟它,这是没有竞争条件的情况下不能完成的。
当然这是C,但是由于Java是用C语言实现的,所以它不能做比这更好的事情(至少在系统调用方面:-))。
在审慎模式下, logback将安全地处理多个JVM,可能在不同的主机上写入相同的网络共享文件。 它甚至可以处理临时的网络故障。 对于少数节点来说,性能应该是可以接受的,比如4或者更少。 对于5个或更多的节点,所有记录很重的,你可能会注意到一个性能问题
我们有一个要求,我们需要从运行相同应用程序的所有受管服务器生成单个文件。 我们开发了一个java日志服务器,它打开一个端口并监听日志事件。 我们使用log4j套接字appender将日志事件写入同一个端口并创建一个文件。
我们使用org.apache.log4j.net.SyslogAppender使用syslog登录到一台机器,它对我们来说工作得很好。 我会建议寻找作为替代。
这看起来像一个非常糟糕的主意(腐败日志,给定日志条目来源的不确定性是想到的两个原因)。 如果你在这样的Weblogic中使用Log4j,我建议你这样做。 这将允许您为整个应用程序服务器使用一个文件,而不会有任何问题。
同步日志写入的建议对我来说没有任何意义,因为基本上在应用程序服务器写入日志时会阻止所有应用程序。 如果日志记录频繁,则会显着减慢一切。
对于多个应用程序服务器,如果您希望将它们全部整合,则需要使用基于文件的日志记录以外的其他功能 有几种方法可以做到这一点,一个是登录到不同的文件,并有不同的进程结合起来,但更好的选择可能是使用基于网络的日志存储库,使用Log4j的SocketAppender或其他方法(nathan提到的SyslogAppender如果你想要一个系统日志是很好的),以确保文件访问不被损坏。
最好的情况下,我会想象你有一个潜在的性能问题与同步访问日志文件资源。 最糟糕的情况是你提到的一些场景。
我会问两个问题:a)这个配置的目标是什么?b)你能找到一个更好的技术解决方案来实现这个目标。
我的猜测是,你有一个系统管理员想要得到一个“系统的单一日志文件”。 该文件被扔在网络共享上,以方便使用。 目标的更好的答案可能是多个文件,每个系统本地和像http://www.splunk.com/一个不错的显示器。
如果可能的话,为每个实例使用不同的文件。 这将以最小的努力给出最好的结果。
log4j的logback替代方案对其日志写入器有一个谨慎的模式,明确地跳过这个循环以确保新的东西写在文件的末尾。 我不认为这将在网络共享上工作。
如果您必须有一个中央日志记录位置,请考虑设置一个服务器接受日志事件并将其写入相应的文件。 这将确保只有一个实际访问文件系统的进程,并让JVM在同步等方面能够尽其所能。