我在同一个tomcat上运行了几个Web应用程序。
我有两个问题:
1-通过搜索,我了解到当存在多个应用程序时,登录同一文件可能会出现一些问题。这是在同一个Web服务器上运行的多个应用程序的情况吗?当使用默认的stdout输出时,这也是正确的吗?
2-在Logback库中有一个谨慎的模式:
在谨慎模式下,即使存在可能在不同主机上运行的不同JVM中运行的其他FileAppender实例,FileAppender也会安全地写入指定文件。 prudent模式的默认值为false。
我想知道使用Logback是否只对多个JVM有利,还是对同一个Web服务器上运行的多个应用程序也有利?如果没有,在这方面是否与log4j相同?
由于
答案 0 :(得分:18)
在log4j和logback中,如果多个FileAppender
实例写入同一个日志文件,则所述日志文件损坏会有高风险。 FileAppender
实例在同一JVM或不同JVM上运行是否无关紧要,即损坏的风险是相同的。
如文档中所述,在prudent mode中,logback的FileAppender
将避免损坏,即使存在在相同或不同JVM中运行的其他FileAppender
实例,也可能在不同的主机上运行。默认情况下,禁用谨慎模式。
控制台无法破坏,所以问题没有实际意义。
答案 1 :(得分:3)
有一点必须澄清:当不同实例的Log4j 同时写入同一文件时,无论是否在同一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)