2011-03-28 54 views
1

我無法配置log4net以按我想要的方式工作。我有一個類庫庫Library.dll,用於我的應用程序Mine.exe和第三方應用程序Other.exe。我有Mine.exe和Library.dll都使用的另一個類庫Util.dll。針對不同dll實例的常見log4net日誌記錄

Mine.exe和Other.exe是並行運行的,我希望Library.dll的兩個實例使用相同的日誌文件。它也應該與Mine.exe的日誌文件分開。當Library.dll調用時,Util.dll應該記錄到Library.dll日誌文件,以及從Mine.exe調用Mine.exe日誌文件。

編輯:我想這是一個有點難以遵循,這是我多麼希望我的工作:

Mine.exe日誌Mine.log
Other.exe不記錄任何東西(第三方應用程序)
Mine.exe - > Library.dll日誌到C:\ Library.log
Other.exe - > Library.dll日誌到C:\ Library.log
Mine.exe - > Util.dll日誌到Mine.log
Mine.exe - > Library.dll - > Util.dll記錄到C:\ Library.log
Other.exe - > Library.dll - > Util.dll記錄到C:\ Library.log Other.exe不直接調用Util.dll。

首先我想在Library.dll加載自定義log4net的配置,採用:

log4net.Config.XmlConfigurator.Configure(new FileInfo("Library.log4net.config")); 

但是,這導致Mine.exe也記錄到日誌文件Library.dll。

我然後試圖加入以下組件屬性在Library.dll:

[assembly: log4net.Config.Repository("Library")] 

即保持日誌分開,但是隨後Util.dll記錄到從Library.dll稱爲即使當Mine.exe日誌文件。我想我可以在Mine.dll中使用Util.dll中的Repository(「Util」),Library.dll中的AliasReposity(「Util」,「Library」)和AliasReposity(「Util」,「Mine」),但我實際上有很多該項目中的類庫,而不是沿着這條路線走下去。

有關如何使這項工作的任何想法?

/Andreas

+0

讓我確保我有這樣的直觀:您希望Main和Other的庫登錄到日誌文件「 A「,但是我和他們自己可以登錄到文件」B「和」C「,並將Util用於任何程序的日誌文件中,稱爲它? – 2011-03-28 20:20:40

+0

你應該檢查你的問題。似乎有(至少)文件擴展名(Library.exe與Library.dll)混合。另外,您可能應該考慮從應用程序(即exe)的角度進行日誌記錄。也就是說,無論所使用的DLL如何,都將單個應用程序中的所有內容記錄到單個日誌文件中。 Mine.exe +所有的DLL登錄到,比如說「Mine.log」。 Other.exe +所有DLL登錄到「Other.log」。看起來更直觀,但當然這只是我的2克拉。 :-) – 2011-03-29 05:32:38

+0

是的,我得到了擴展混淆,現在修復。我想從Library.exe生成一個通用日誌的原因是,它幾乎就像一個單獨的應用程序,我希望日誌交織在一個文件中。在舊的COM時代,我可能已經將它變成了一個進程外服務器而不是一個dll。 – Anlo 2011-03-29 06:43:21

回答

1

我不會分享日誌文件的說實話。如果您從兩個進程登錄文件,可能會遇到各種線程問題。通常,一個log4net實例將無法記錄另一個log4net實例,因此它會導致日誌條目丟失。同樣,如果它們在同一個日誌文件中,則需要在日誌格式化程序中查找進程名稱,以便知道源代碼。聽起來很複雜。按照慣例,我通常會執行以下操作:

  • 在每個進程中引用相同的log4net dll。
  • 分別在process1.exe.config和process2.exe.config中創建一個log4net配置節。
  • 在每個配置中分別爲process1.exe.log和process2.exe.log添加一個文件appender。

您爲兩個進程獲得兩個文件,但這更容易管理。您可以獲取可以同時顯示兩個日誌的日誌文件觀察器(儘管我傾向於不使用該方法),例如:http://tailforwin32.sourceforge.net/

+0

我推遲了與Library.dll一起記錄Util.dll的需求,並使用了Repository屬性。當一次運行Mine.exe和Other.exe時,它運行良好,但是當同時運行應用程序時,只有第一個應用程序開始在文件中獲取任何日誌。 – Anlo 2011-04-01 07:21:32