0

我有一个 NLog 目标:

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

Error.html 看起来像这样:

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

如何让 NLog 解析 error.html 的内容,以便使用 NLog 规则呈现 ${message} 参数?

4

1 回答 1

0

我尝试了一下并提出了这个解决方案:

  • 我的新渲染器继承自 NLog.LayoutRenderers.FileContentsLayoutRenderer
  • 然后,在 Append() 方法中,我有这段代码(与 FileContentsLayoutRenderer 的 Append() 方法中的代码非常相似:

    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 回收之前,该文件将保留在内存中并且永远不会从磁盘重新读取。因此,进行更改最初不会影响输出。

我添加了一些调试代码来处理这个问题,但需要添加更健壮的代码来识别生产环境中的变化。

于 2010-02-08T23:18:46.713 回答