2015-09-30 76 views

回答

0

一種方法是使用IoC容器。只需定義一個接口,然後根據該接口定義記錄器類。然後可以根據需要創建或注入他們的其他課程。

+0

這個答案在'NLog'上下文中嗎? – Pablo

+0

我對NLog上下文一無所知。我通常使用溫莎城堡,但你也可以使用任何這些:http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx – DrewB

+0

請檢查標記,我的問題是關於'NLog' – Pablo

0

您的nlog配置定義彼此獨立的規則和目標。您的要求是有2個目標,一個文件記錄器和一些其他記錄器,在文本框中顯示您的日誌條目。您只需在您的nlog配置中添加兩條規則即可將您的日誌條目定向到這兩個目標。

這將是一個示例nlog.config,它將所有日誌條目記錄到兩個不同的目標。您可以爲各個日誌規則設置不同的minLevel。第一個目標是一個簡單的文件記錄器,另一個目標是一個MethodCall目標,該目標使用日誌參數調用靜態方法。查看nlog documentation瞭解所有可用目標和更多文檔。

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/> 
    </configSections> 
    <nlog> 
    <targets> 
     <target name="toFile" type="File" 
      layout="${longdate} ${level} [${threadid}] - ${callsite}: ${message} ${onexception:${newline}Ausnahme\:${exception:format=tostring}}" 
      fileName="${basedir}/log.txt" 
      archiveFileName="${basedir}/log.{#####}.txt" 
      archiveAboveSize="1024000" 
      archiveNumbering="Sequence" 
      concurrentWrites="true" 
      keepFileOpen="false" 
      maxArchiveFiles="3" 
      /> 

     <target xsi:type="MethodCall" 
     name="toRichTextBox" 
     methodName="String" 
     className="String"> 
     <parameter layout="Layout" name="String" type="System.Type"/><!-- repeated --> 
     </target> 

    </targets> 
    <rules> 
     <logger name="*" minlevel="Warn" writeTo="toFile" /> 
     <logger name="*" minlevel="Warn" writeTo="toRichTextBox" /> 
    </rules> 
    </nlog> 
</configuration> 
+0

如何在代碼中使用單個'logger.Debug(...)'來讓它登錄到兩個目標?假設我已經在代碼中有很多正在寫入文件目標的調試消息,並且我還想添加第二個目標,而不修改所有的'logger.Debug'行? – Pablo

+0

是的,這應該工作。您可以使用記錄器規則將特定類或名稱空間中的消息記錄到不同的目標中(在「name」屬性中爲「*」完成),但只要您將日誌條目轉發給所有目標喜歡。 –

+0

您可以用示例更新您的示例配置嗎? – Pablo