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>

${message} パラメータが NLog ルールでレンダリングされるように、NLog に error.html の内容を解析させるにはどうすればよいですか?

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 に答える