2012-08-12 49 views
15

我有幾個web應用程序在同一個tomcat上運行。Log4j vs Logback:併發寫入相同的日誌?

我有兩個問題:

1-通過搜索,我的理解是,當多個應用程序都存在,登錄到同一個文件可能會讓一些問題。這是多個應用程序在同一個Web服務器上運行的情況嗎?當使用默認的stdout輸出時,這也正確嗎?

2-在的logback庫有一個謹慎模式:

在謹慎模式,FileAppender將安全寫入指定的文件,即使在不同的JVM運行的其他FileAppender實例的存在,潛在地運行上不同的主機。謹慎模式的默認值爲false。

我想知道如果使用Logback只對多個JVM有利,或者對於在同一個Web服務器上運行的多個應用程序也是有利的?如果不是,這與log4j在這方面是否相同?

感謝

回答

1
  1. 是。一般來說,你的原則應該是你爲每個應用程序編寫一個不同的日誌文件(web或不)。另一種方法是,將其留給服務器決定要寫入的文件。 JBoss有通用註銷的方法,它們將轉到同一個文件。不過,我仍然希望每個應用程序都有一個單獨的日誌。
  2. 據我所知,log4j和Logback的目標都是儘量減少開銷,他們可以導致應用程序,所以不太可能有更好的。如果多個JVM對你來說至關重要,我相信Logback更擅長處理它,但在這之外使用它並不是一個壞主意。
3

有一兩件事必須澄清:不會有問題的時候不同情況下的Log4j的寫入同一個文件同時,無論是在同一個JVM運行與否。

當使用服務器(和不同的類加載器)時,根據部署和配置,可能只有一個服務器範圍的實例或多個Log4j實例。

  1. 請參閱上文。標準輸出可能會遇到相同的混合輸出問題,但不能在旋轉文件時使用。
  2. Logback的謹慎模式將解決不同實例(相同的JVM與否)的併發寫入。如果您的配置使用服務器範圍的Log4j實例,則在這方面沒有任何優勢。
+0

我們可以詳細說明是什麼問題?這些是: 混合行,混合內容在一行中,丟失日誌,滾動文件名稱的問題? – j23 2015-09-18 07:33:00

15

在這兩個Log4j和的logback如果多個FileAppender實例寫入同一個日誌文件,對上述日誌文件成爲腐敗的一個風險。 FileAppender實例是否在相同的JVM或不同的JVM上運行是無關緊要的,即腐敗的風險是相同的。

如在文檔中的logback prudent modeFileAppender將避免腐敗即使在相同或不同的JVM上運行的其他FileAppender實例的存在提到,,在不同的主機可能運行。默認情況下,謹慎模式被禁用。

控制檯不能損壞,所以問題是沒有意義的。

1

使用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 mailinglist

SocketAppenders可能有點粗糙,因爲你可能沒有編寫大量的logback代碼。

還有一個選項。你可以使用clusterlog之類的東西,它可以解決你所遇到的問題。