2011-01-06 66 views
11

我想實現日誌功能到一個類庫中,它本身在web服務中被引用。我嘗試添加app.config並完成了所有需要的操作,但似乎在引發異常時,log4net完全沒有任何作用。如何將log4net包含到類庫中?

我的app.config

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\mylogfile.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="test" /> 
     </filter> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="error" /> 
     </filter> 
     <filter type="log4net.Filter.DenyAllFilter" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %level %logger - %message%newline%exception" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO"/> 
     <appender-ref ref="RollingFileAppender"/> 
     <appender-ref ref="ConsoleAppender" /> 
    </root> 
    </log4net> 
在AssemblyInfo.cs中

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "app.config")] 
在LogManager.cs

private static readonly ILog Log = log4net.LogManager.GetLogger 
      (MethodBase.GetCurrentMethod().DeclaringType); 
public static void WriteLog(Exception ex) 
{ 
    Log.Error(ex); 
} 

能否請你告訴我,什麼是錯的?我怎樣才能讓log4net爲我的類庫工作?

謝謝

+0

代碼如何看起來像你在調用WriteLog? – 2011-01-06 07:42:02

+0

順便說一句,你有沒有嘗試將根級別設置爲ALL,並嘗試刪除RollingFileAppender上的所有篩選器。 – 2011-01-06 07:45:20

+0

@Pauli:我試着按照你的建議,它仍然沒有工作:) – Vimvq1987 2011-01-06 07:59:02

回答

1

請參閱我的回答以下問題:

Use log4net in SDK

它有一個日誌配置程序,將構建一個log4net的配置文件中的完整路徑。因爲你在web服務中,所以我不在尋找你期望的「app.config」。

另外,還要確保你有寫權限「d:\ mylogfile.txt」從你的web服務。

6

在運行時,配置文件總是從主機應用程序使用,除非明確聲明。在這種情況下,web.config正在被使用而不是app.cofig。而是提及一些其他自定義配置文件名,並確保該文件被複制到Web服務的虛擬目錄中。正如chibacity所說,確保日誌文件的權限。最好將其保存在Web服務主機的app_data文件夾中。

3

你可以使用某種形式的注入,任你打造一個簡單的名字:

public interface ILogger 
{ 
    void LogInfo(string message); 
     . 
     . 
     . 
} 

然後你只需注入相匹配的接口,像log4net的或這樣的一個包裝的東西。

但是,我認爲最正確的是不登錄類庫。爲什麼我這麼認爲是因爲庫本身不是應用程序,所以你的Web服務是這樣的,你的Web服務應該決定要記錄什麼。如果你想記錄異常,就不要在類庫中捕獲異常,並讓Web服務處理日誌記錄。這也將使記錄的集中化變得更容易。

相關問題