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

时间:2012-08-12 22:22:03

标签: java web-applications logging log4j logback

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

我有两个问题:

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

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

  

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

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

由于

4 个答案:

答案 0 :(得分:18)

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

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

控制台无法破坏,所以问题没有实际意义。

答案 1 :(得分:3)

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

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

  1. 见上文。 Stdout可能会遇到相同的混合输出问题,但在旋转文件时则不会。
  2. Logback的谨慎模式将解决不同实例(相同的JVM或不同)的并发写入问题。如果您的配置使用服务器范围的Log4j实例,则此方面没有任何优势。

答案 2 :(得分:2)

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

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- Support multiple-JVM writing to the same log file -->
    <prudent>true</prudent>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory> 
    </rollingPolicy>

    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender> 

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

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

JDBCAppender 将来会被完全替换,并且不推荐。请参见logbacks mailinglist

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

还有一个选项。您可以使用类似clusterlog的内容,这些内容已经构建,可以解决您遇到的问题。

答案 3 :(得分:1)

  1. 是。通常,您的原则应该是为每个应用程序(Web或非Web)编写不同的日志文件。另一种方法是,将它留给服务器来决定要写入的文件。 JBoss有通用注销的方法,它将转到同一个文件。但是,我仍然希望每个应用程序都有一个单独的日志。
  2. 据我所知,log4j和Logback都旨在最小化它们可能导致应用程序的开销,因此不太可能有一个更有利的。如果多个JVM对您来说至关重要,我相信Logback在处理它时会更好,但在此之外使用它并不是一个坏主意。