2010-04-07 40 views
10

我們的應用程序服務器(weblogic)都使用log4j登錄到網絡共享中的同一文件。最重要的是,我們讓託管服務器中的所有Web應用程序將錯誤記錄到常見的error.log中。我無法想象這是一個好主意,但希望聽到一些專業人士的意見。我知道每個Web應用程序都有自己的類加載器,因此任何線程同步都只發生在應用程序內。那麼當多個進程開始收斂到單個日誌文件時會發生什麼?我們可以期望穿插日誌語句嗎?性能問題?怎麼樣多個網絡應用程序登錄到一個通用的日誌文件?環境是Solaris。從多個應用程序/進程記錄到單個日誌文件

+0

你有沒有經歷過任何實際的日誌損壞?如果答案是否定的,我會感到驚訝,否則我無法想象爲什麼你問這個問題。 – Yishai 2010-04-07 21:52:55

+0

沒有日誌損壞,但我知道。我在問,因爲我無法相信他們已經這樣設置並想要一些反饋來證實我的懷疑。 – Andrew 2010-04-07 22:06:12

+0

我應該明確說明一個日誌文件不是必需的;這是巧合的設計。少數人提到單個日誌文件的正確技術是使用網絡日誌服務,或者每個服務器日誌記錄使用應用程序的服務器日誌服務。 – Andrew 2010-04-08 14:43:34

回答

6

這是一個非常糟糕的主意,沒有對文件的寫入訪問進行同步,並且肯定是不好的編程實踐。它可能工作的唯一情況是附加到本地計算機上的文件 - 每個人只需在文件末尾添加行。

但是,由於您的文件位於網絡共享上,因此很可能會很快變成垃圾。你沒有告訴其分佈您正在使用的文件系統,但對於NFS,你可以找到以下的open(2)手冊頁解釋:

O_APPEND 該文件中追加模式打開。在每次寫入()之前,文件偏移量 位於文件末尾, 就像使用lseek()一樣。如果多個進程一次將數據 附加到文件,O_APPEND可能會導致 損壞NFS文件系統上的文件 。這是因爲NFS 不支持附加到文件,因此客戶端內核必須模擬 它,這不能在沒有競爭 條件下完成。

當然這是C,但是由於Java是用C實現的,所以它不能做比這更好的事情(至少不是關於系統調用:-))。

+0

我相信這是NFS,但他們不讓我靠近服務器。那麼同一個服務器中的多個Web應用程序如何登錄到同一個文件呢?那將是一個過程。 – Andrew 2010-04-07 22:10:28

+0

一個進程,很多線程仍然是一樣的。另外,是不是在不同的流程中啓動不同的網絡應用?無論如何,這有機會在我的回答開始時工作。但依賴於它是一個糟糕的主意。 – pajton 2010-04-07 22:15:22

+0

服務器的所有Web應用程序都在相同的進程中運行。好的,所以它在Unix上是安全的,但仍然可以穿插日誌記錄。 – Andrew 2010-04-07 22:20:06

1

我們使用org.apache.log4j.net.SyslogAppender使用syslog登錄到單臺機器,它對我們來說工作得很好。我會建議作爲替代方案進行調查。

+0

好的建議。我想象這些調用是異步的,所以沒有太多的性能損失 – Andrew 2010-04-07 22:11:19

1

這看起來像一個非常糟糕的主意(腐敗日誌,給定日誌條目源的不確定性是想到的兩個原因)。如果你像這樣在Weblogic中使用Log4j,我建議你這樣做by-the-book。這將允許您爲整個應用程序服務器使用一個文件,而不會有任何問題。

同步日誌寫入的建議對我來說毫無意義,因爲基本上在應用服務器寫入日誌時會阻止所有應用程序。如果日誌記錄頻繁,那會顯着減慢一切。

對於多個應用程序服務器,如果要將它們全部整合,則需要使用除基於文件的日誌記錄以外的其他功能。有幾種方法可以做到這一點,一種是登錄到不同的文件,並有一個不同的過程組合它們,但更好的選擇可能是使用基於網絡的日誌記錄庫,使用Log4j的SocketAppender或其他方法(nathan提及SyslogAppender)如果你想要一個系統日誌,這是非常棒的),以確保文件訪問不會被破壞。

1

最好的情況我會想象你有一個潛在的性能問題,同步訪問日誌文件資源。最糟糕的情況是你提到的一些場景。

我會問兩個問題:a)這個配置的目標是什麼?b)您能找到一個更好的技術解決方案來實現這個目標。

我的猜測是你有一個系統管理員想要得到一個「系統的單一日誌文件」。該文件被引發到網絡共享上,以便輕鬆訪問。目標的更好的答案可能是多個文件,每個系統都是本地的,像http://www.splunk.com/這樣的文件對於一個很好的監視器來說也是如此。

0

如果可能的話,爲每個實例使用不同的文件。這將以最小的努力得到最好的結果。

log4j的logback替代方案對其日誌寫入程序有一個審慎的模式,它顯式地跳過這個循環以確保在文件末尾寫入新的東西。那麼我認爲這不會對網絡共享起作用。

如果您必須有一箇中央日誌記錄位置,那麼請考慮設置一個接受日誌事件的服務器並將它們寫入相應的文件。這將確保它只是一個實際訪問文件系統的進程,並且會讓JVM在同步等方面提供全部幫助。

+0

Logback的謹慎模式適用於網絡共享。對於少數幾個服務器節點,說4或更少,它會很好地工作。 – Ceki 2010-04-08 21:10:41

9

prudent mode logback將安全地處理可能在不同主機上寫入的多個JVM網絡共享文件。它甚至可以處理臨時的網絡故障。對於少數節點,性能應該是可以接受的,例如4或更少。對於5個或更多的節點,您可能會注意到性能受到嚴重影響。

5

我們需要從運行相同應用程序的所有受管服務器生成單個文件。我們開發了一個java日誌服務器,它打開一個端口並監聽日誌事件。我們使用log4j socket appender將日誌事件寫入相同的端口並創建一個文件。

相關問題