Log4j vs Logback:并发写入同一个日志?

我有几个在同一个tomcat上运行的Web应用程序。

我有两个问题:

1-通过搜索,我了解到当存在多个应用程序时,登录到同一文件可能会出现一些问题。 这是在同一个Web服务器上运行的多个应用程序的情况吗? 使用默认的stdout输出时,这也是正确的吗?

2-在Logback库中有一个谨慎的模式:

在谨慎模式下,即使存在可能在不同主机上运行的不同JVM中运行的其他FileAppender实例,FileAppender也会安全地写入指定文件。 prudent模式的默认值为false。

我想知道使用Logback是否仅适用于多个JVM,还是对同一Web服务器上运行的多个应用程序也有利? 如果没有,这方面的log4j是否相同?

谢谢

在log4j和logback中,如果多个FileAppender实例写入同一个日志文件,则所述日志文件损坏的风险很高FileAppender实例是在相同的JVM上运行还是在不同的JVM上运行是无关紧要的,即损坏的风险是相同的。

正如文档中所提到的,在谨慎模式下, logback的FileAppender将避免损坏,即使存在在相同或不同JVM中运行的其他FileAppender实例,也可能在不同主机上运行。 默认情况下,禁用谨慎模式。

控制台不能被破坏,所以问题没有实际意义。

有一点必须澄清:当Log4j的不同实例同时写入同一文件时 ,无论是否在同一JVM中运行,都会出现问题。

使用服务器(和不同的类加载器)时,可能有一个服务器范围的实例或多个Log4j实例,具体取决于部署和配置。

  1. 往上看。 Stdout可能会遇到相同的混合输出问题,但在旋转文件时则不会。
  2. Logback的谨慎模式将解决不同实例的并发写入(相同的JVM与否)。 如果您的配置使用服务器范围的Log4j实例,则此方面没有任何优势。
  1. 是。 通常,您的原则应该是为每个应用程序(Web或非Web)编写不同的日志文件。 另一种方法是,将它留给服务器来决定要写入的文件。 JBoss有通用注销的方法,它将转到同一个文件。 但是,我仍然希望每个应用程序都有一个单独的日志。
  2. 据我所知,log4j和Logback都旨在最小化它们可能导致应用程序的开销,因此不太可能有一个更有利的。 如果多个JVM对您来说至关重要,我相信Logback在处理它时会更好,但在此之外使用它并不是一个坏主意。

使用Filelocks实际上从来都不是高效/安全的,因此当从不同的appender / JVM工作中记录到同一个文件时,不建议这样做。 请参阅我从logback-appenders-faq直接获取的配置。

    true  logFile.%d{yyyy-MM-dd}.log 30   %-4relative [%thread] %-5level %logger{35} - %msg%n       

写入某个统一源的多个JVM的其他选项是SocketAppendersJDBCAppender

JDBCAppender将来会被完全替换, 也不建议使用。 请参阅logbacks mailinglist。

SocketAppenders可能有点原始,因为你可能没有计划编写很多代码用于logback。

还有一个选择。 您可以使用像clusterlog这样的东西,它已被构建以解决您所遇到的问题。