2009-11-13 44 views
8

我有幾個進程同時運行,我想登錄到同一個文件。使用企業庫從多個進程記錄到同一文件4.1

我們一直在使用企業庫4.1日誌記錄應用程序塊(使用RollingFlatFileTraceListener),並且它工作正常,除了當兩個進程嘗試寫入日誌文件時,它將GUID預先記錄到日誌文件名同一時間(我相信System.Diagnostics.TextWriterTraceListener怪癖)。

我已經嘗試了各種各樣的東西,包括在寫入日誌文件後調用Logger.Writer.Dispose(),但是每次寫入日誌條目時都會發生阻塞調用,這並不理想。

EntLib論壇建議在分銷商服務中使用MSMQ,但這不是一個選項,因爲MSMQ在我的公司不允許。

有沒有另一種方法可以快速輕鬆地從多個線程/進程登錄到同一個文件?

+0

你有沒有得到替代解決方案?也許使用*** MSMQ ***? – Kiquenet 2016-03-08 14:06:22

+0

@Kiquenet已經這麼久了,我不記得了。如果我真的努力嘗試,我依稀記得我們最終使用不同的日誌文件來處理這個問題。這並不理想,但我們希望保持簡單。 – Riko 2016-03-22 17:43:30

+0

如果我現在必須選擇一個日誌記錄框架,我可能會添加,但我會盡可能遠離Enterprise Library。這太複雜了,無論是使用還是配置,都不容易擴展。我可能會使用[log4net](https://logging.apache.org/log4net/)或[NLog](http://nlog-project.org/)。 – Riko 2016-03-22 17:50:52

回答

4

對不起,但答案是否定的。文件TraceListeners鎖定輸出文件,因此只有一個TraceListener可以登錄到文件。

您可以嘗試其他不是基於文件的跟蹤偵聽器(例如數據庫,事件日誌)。

我能想到的另一個選擇是編寫自己的日誌服務(進程外),它將登錄到文件並接受LogEntries。然後創建一個自定義跟蹤偵聽器,將消息發送到您的服務。

這可能不是一個好主意,因爲您會進行一些自定義開發,再加上它可能會影響性能,因爲它是一個過程調用。基本上你正在建立你自己的簡化的僞分發服務。

+0

這也是我們同樣的結論。從長遠來看,我們可能會編寫一個簡單的「即燃即用」WCF服務進行日誌記錄,這似乎是唯一可行的選項。 雖然可惜。 – Riko 2009-11-16 10:13:53

2

EntLib在寫入日誌文件時鎖定日誌文件。因此,2個進程無法寫入相同的日誌文件。

當我們遇到這個問題時,我們需要從很多不同的地方登錄到同一個地方,我們使用了數據庫日誌記錄。

如果您100%記錄到文本文件,則可以登錄到單個日誌文件,然後編寫一個程序來合併這些文件。

+0

即使在同一個進程中,2個獨立的Trace Listeners也不能登錄到同一個文件。 – 2009-11-13 16:02:13

+0

是的,數據庫日誌不是我們的選擇,我們沒有。目前我們確實正在使用我們合併在一起的單個日誌文件。但這只是一個短期的解決方法。 – Riko 2009-11-16 10:11:42

1

我知道這是舊的,但如果你仍然好奇。 log4net支持:

http://logging.apache.org/log4net/release/faq.html#How do I get multiple process to log to the same file?
+1

謝謝。在這個項目上使用log4net不是一個選項。如果這是我的決定,我肯定會在EntLib上使用它,但EntLib日誌過於臃腫,難以理解。 – Riko 2010-08-09 11:27:31

0

當應用程序池回收並允許重疊線程時,會出現此問題。關閉線程仍然打開,新線程出錯。嘗試在IIS中禁用重疊的回收行爲,或者創建自己的文本編寫器版本。