我有一个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}参数?
答案 0 :(得分:0)
我抓了一下,然后提出了这个解决方案:
然后,在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回收之前,该文件将保留在内存中,永远不会从磁盘重新读取。因此,进行更改不会影响最初的输出。
我添加了一些调试代码来处理这个问题,但是需要添加更强大的代码来识别生产环境中的变化。