Come arrivare NLog ai contenuti di parsing di file-contenuti renderer?
Domanda
Ho un obiettivo 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 assomiglia a questo:
<div>
<b>Message</b>=${message}
</div>
Come posso ottenere NLog per analizzare il contenuto di error.html, in modo che il messaggio {} param $ viene reso con regole NLog?
Soluzione
Ho preso una pugnalata a esso e si avvicinò con questa soluzione:
- I miei nuovi eredita renderer da NLog.LayoutRenderers.FileContentsLayoutRenderer
-
Poi, nel metodo Append (), ho questo codice (che è molto simile al codice a Append di FileContentsLayoutRenderer () Metodo:
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);
Il problema più grande di questo è che fino a quando ricicla AppDomain della app, il file rimarrà nella memoria e mai ottenere ri-letta dal disco. Così facendo modifiche non influenza l'uscita inizialmente.
Ho aggiunto un po 'di codice di debug per gestire questo, ma hanno bisogno di aggiungere il codice più robusto di riconoscere il cambiamento in un ambiente di produzione.