2014-11-06 72 views
6

我正在使用visual studio 2008,.net framework 3.5,windows 7上的一個解決方案。我創建了一個log4net庫,它寫入一個txt文件,並希望在我的解決方案上的幾個項目上使用它, wcf服務與Visual Studio本地運行的解決方案相同。如何設置log4net,以便它可以在wcf服務上運行?

我從解決方案的控制檯應用程序啓動程序。控制檯應用程序調用其他項目,這些項目使用log4net。在工作流程的這個級別,日誌寫得很好。問題出現在調用wcf服務時。 wcf服務使用日誌,但log4net不寫入文件。

在控制檯上的項目,我有這樣的:

在AssemblyInfo.cs中:

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

在App.config中我有log4net的配置。

在Program.cs中,在Main方法,我有:

LogManager.GetLogger("Initialise log4net from the current assembly attributes"); 

在WCF服務我有這樣的:

在AssemblyInfo.cs中作爲控制檯項目相同。

與Web.config中的控制檯項目上的App.config相同。

在Service1.svc的構造我:

LogManager.GetLogger("Initialise log4net from the current assembly attributes"); 

這是我的App.config中和的Web.Config如何洛斯類似:

的configSections標籤中:

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/> 

並且在主配置標籤內:

<log4net> 
    <root> 
     <level value="DEBUG"/> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
     <file value="C:\test3.txt"/> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d [%t] %-5p %c %m%n" /> 
     </layout> 
    </appender> 
    </log4net> 

我該如何解決這個問題?

+0

我從來沒有設法讓我的WCF服務使用匯編屬性,最後我放棄了,只是使用了'XmlConfigurator.ConfigureAndWatch(...)' – stuartd 2014-11-06 22:36:47

+0

@stuartd您在說我應該刪除服務的web.config上的log4net部分,並將該部分保留在服務上的AssemblyInfo.cs中。我做了這種改變,但仍然沒有寫入文件。 – pyram 2014-11-06 23:14:12

+1

不,我從來沒有設法讓我的WCF服務通過程序集屬性加載log4net,所以我使用XmlConfigurator來配置日誌記錄。我沒有花費太多時間,因爲我想要記錄工作並繼續前進。調用GetLogger後,LogManager.GetRepository()。Configured'是否返回true? – stuartd 2014-11-06 23:27:56

回答

3

你有一個XmlConfigurator的例子,所以我可以配置日誌記錄?

var logpath = HostingEnvironment.MapPath("~/web.config"); 
var fileInfo = new FileInfo(logpath); 

if (fileInfo.Exists == false) 
{ 
    throw new InvalidOperationException("Can't locate the web.config file"); 
} 

log4net.Config.XmlConfigurator.ConfigureAndWatch(fileInfo); 

注意,只有到configureAndWatch方法這需要一個FileInfo在讀取.config文件直接而不是使用System.Configuration(這一次它讀取的可以觀看一個app.config或web.config中的過載該文件不能重新讀取它)。

該文件解釋了這個here

編輯由@pyram:因爲這兩個項目都記錄到同一個文件,有必要將此行添加到兩個項目的附加器配置:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
+0

在調用GetLogger方法之前,我已將您的答案代碼放入服務構造函數中。我可以看到** LogManager.GetRepository()。Configured **返回true,但服務仍然不寫入文件。我已將我的配置置於我的問題中。 – pyram 2014-11-07 16:01:55

+1

配置看起來確定。你在打日誌嗎? – stuartd 2014-11-07 16:43:09

+0

GetLogger方法的調用?.....是的,在我的服務構造函數中,我已經放置了你的代碼,之後我已經調用了這樣的日誌** LogManager.GetLogger(「Initialise log4net from當前程序集屬性「); ** – pyram 2014-11-07 20:48:48

相關問題