2010-02-02 110 views
0

我有一個目標NLOG:如何讓NLog解析文件內容渲染器的內容?

<target name="AspNetAsyncWrapperForMail" xsi:type="ASPNetBufferingWrapper"> 
    <target name="mail" xsi:type="Mail" 
     subject="Error: ${callsite:includeSourcePath=False}" 
     smtpServer="MySMTP" 
     from="[email protected]" 
     to="[email protected]" 
     smtpAuthentication="None" 
     body="${date}${file-contents:${basedir}/error.html}" 
     html="true"/> 
</target> 

的error.html看起來是這樣的:

<div> 
    <b>Message</b>=${message} 
</div> 

我怎樣才能得到NLOG解析中的error.html的內容,使$ {}消息使用NLog規則渲染param?

回答

0

我參加了一個刺它,並用此溶液想出了:

  • 我的新的渲染從NLog.LayoutRenderers.FileContentsLayoutRenderer
  • 繼承
  • 然後,在追加()方法,我有這樣的代碼(這是非常類似FileContentsLayoutRenderer的附加代碼()方法:

    lock (this) 
    { 
         var fileName = FileName.GetFormattedMessage(logEvent); 
    
         if (fileName != m_LastFileName) 
         { 
          ReadFileContents(fileName); 
         } 
    
         var layoutString = new Layout(_fileContents); 
         m_RenderedContent = layoutString.GetFormattedMessage(logEvent); 
         m_LastFileName = fileName; 
    } 
    
    builder.Append(m_RenderedContent); 
    

的最大問題這是直到應用程序的appdomain回收,該文件將保留在內存中,永遠不會從磁盤重新讀取。因此,進行更改不會影響最初的輸出。

我已經添加了一些調試代碼來處理這個問題,但需要添加更強大的代碼來識別生產環境中的更改。

+0

只是爲了清楚。由於某些重大更改,這在版本2中不起作用。看這裏:http://nlog-forum.1685105.n2.nabble.com/CompiledLayout-GetFormattedMessage-Layout-Render-td6503485.html – sprinter252 2011-11-14 10:35:42