2010-02-02 60 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