Как получить NLog для анализа содержимого рендерера содержимого файла? - PullRequest
0 голосов
/ 02 февраля 2010

У меня есть цель 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, чтобы параметр $ {message} отображался с помощью правил NLog?

1 Ответ

0 голосов
/ 09 февраля 2010

Я сделал удар и нашел решение:

  • Мой новый рендерер наследуется от NLog.LayoutRenderers.FileContentsLayoutRenderer
  • Затем в методе Append () у меня есть этот код (который очень похож на код в методе AppendCon) 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);
    

Самая большая проблема заключается в том, что до тех пор, пока домен приложения не перезапустится, этот файл останется в памяти и никогда не будет перечитан с диска. Поэтому внесение изменений изначально не влияет на вывод.

Я добавил некоторый отладочный код для обработки этого, но мне нужно добавить более надежный код для распознавания изменений в производственной среде.

...