17

I have several web applications running on the same tomcat.

I have two questions:

1- By searching, I understood that when multiple applications are present, logging into the same file might make some problems. Is that the case for multiple applications running on the same web server? Is that also correct when default stdout output is used?

2- In Logback library there is a prudent mode:

In prudent mode, FileAppender will safely write to the specified file, even in the presence of other FileAppender instances running in different JVMs, potentially running on different hosts. The default value for prudent mode is false.

I want to know if using Logback is only favorable on multiple JVMs or it is also advantageous for multiple we applications running on the same web server? If not, is it identical to log4j in this aspect?

Thanks

4

4 回答 4

19

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

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

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

于 2012-08-14T09:59:27.003 回答
4

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

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

  1. 看上面。标准输出可能会遇到相同的混合输出问题,但在旋转文件时不会。
  2. Logback 的谨慎模式将解决不同实例(相同或不同 JVM)的并发写入。如果您的配置使用服务器范围的 Log4j 实例,则这方面没有优势。
于 2012-08-13T14:47:32.670 回答
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 写入某个统一源的其他选项是SocketAppendersJDBCAppender

JDBCAppender将来会被完全替换,也不推荐。请参阅 logbacks邮件列表

SocketAppenders 可能有点原始,因为您可能不打算为 logback 编写太多代码。

还有一种选择。你可以使用类似clusterlog的东西,它已经被构建来解决你遇到的问题。

于 2012-09-25T08:48:52.387 回答
1
  1. 是的。一般来说,您的原则应该是为每个应用程序(Web 或非 Web)编写不同的日志文件。另一种方法是让服务器决定要写入的文件。JBoss 有办法一般注销,这将转到同一个文件。但是,我仍然更喜欢为每个应用程序设置一个单独的日志。
  2. 据我所知,log4j 和 Logback 的目标都是尽量减少它们可能导致应用程序的开销,因此不太可能有一个更有利的。如果多个 JVM 对你来说是必不可少的,我相信 Logback 更擅长处理它,但在这之外使用它也不是一个坏主意。
于 2012-08-12T22:51:21.633 回答