2011-03-28 21 views

回答

2

它不是真正的(文件)Appender的問題,但更多的LockingModel在它後面。

「隨機」說,你可能會使用MinimalLock,不過請注意,它有兩個主要的缺點:

  • 很壞的性能相比EXCLUSIVELOCK,因爲該文件獲取鎖/釋放每寫入的消息。
  • 它只是防止兩個進程同時寫入。可能還會發生多個進程嘗試寫入單個文件的情況。在這種情況下,只有一個實際上會被授予,所有其他人都會收到錯誤,並且他們的信息會丟失(另請參閱here)。

爲了規避這個問題,你可以編寫你自己的LockingModel它在內部使用互斥鎖。這是(a)MinimalLock的文件鎖定速度更快,並且(b)仍然允許所有進程最終編寫它們的消息(甚至當然,如同intendend,當然是相互排斥的)。我有一個我不幸分享的實現,因爲它來自客戶的項目。但是提出一個實現(他們可能是網絡上的一個,但我現在還找不到它)應該不會太難。

編輯:在此mailing list thread中有一個實現。就我個人而言,我沒有使用它,所以我不知道它是否有效,但它看起來不錯。

更新:只是碰巧注意到原始問題的「不同的佈局」部分。我想這是不可能有一個單一的appender使用兩種不同的佈局。除佈局之外,您可以有兩個配置相同的appender。然後讓他們使用自定義的lockingModel或MinimalLock - YMMV寫入相同的文件。但是,我真的不會那樣做。在同一個日誌文件中有兩個佈局(格式!)使分析或日誌分析變得不必要很難。爲什麼不在第一個地方有兩個文件呢?

+0

謝謝您的詳細解答。令我困惑的是:我是否必須複製appender的所有參數,例如'rollingStyle'和'maximumFileSize'?這聽起來很愚蠢,因爲一個文件不能同時具有100KB和200KB的最大大小。如果將來有人試圖改變其中一個參數而不知道它們在兩個appender之間重複,會發生什麼?這個問題是否可以解決? – 2011-03-28 13:59:34

+0

@Ilya Kogan:我想如果你有兩個(不同配置的)appender寫入同一個文件,那麼無論appender首先觸發一個滾動,通過它的配置完成。如果使用100KB的A1很少寫入,它將永遠不會看到發生100KB的限制,而使用200KB的A2可能會發生。如果A1經常寫,有效的文件將滾動100KB,因爲A2永遠不會看到200KB的限制。我們已經將log4net配置放置在組件之間共享的單獨文件中,以確保它們使用相同的設置(更多請點擊http://logging.apache.org/log4net/release/manual/configuration.html)。 – 2011-03-29 05:18:16

+0

@Ilya Kogan:Ups,只是看到了「不同的佈局」部分。我想如果你真的想這樣做,你必須複製你的appender配置(包括rollingStyle/maximumFileSize),因爲佈局是它的一個嵌入部分 - 或者你使用log4net API以編程方式配置你的appender。 – 2011-03-29 05:20:34

3

嘗試增加以下元件成 每個XML配置文件FileAppender/RollingFileAppender進行元素:

<param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" /> 

我使用這個記錄從許多log4net的供電可執行文件的單個文件。

相關問題