SmtpAppender
no puede lograr esto solo. Entonces, lo que hice fue crear otro appender que a un appender del tipo MemoryAppender
. Establecí un umbral en este registrador para incluir solo los mensajes que deberían desencadenar el SmtpAppender
, p. Error
. Usamos esto para luego determinar si queremos enviar el correo electrónico que tiene más niveles registrados.
En realidad, no nos importan los mensajes en el MemoryAppender
; nos importa que contenga mensajes al final. Los mensajes que recibimos por correo electrónico en realidad provienen del SmtpAppender
.
Al final de mi programa, verifico el appender de memoria para ver si GetEvents() contiene algún evento. Si es así, I no para que el SmtpAppender
funcione normalmente.
configuraciones Log4net para ambos appenders:
<appender name="ErrorHolder" type="log4net.Appender.MemoryAppender" >
<onlyFixPartialEventData value="true" />
<!-- if *any* message is logged with this level, the email appender will
be used with its own level -->
<threshold value="ERROR" />
</appender>
<appender name="Email" type="log4net.Appender.SmtpAppender">
<!-- the level you want to see in the email IF ErrorHolder finds anything -->
<threshold value="INFO"/>
<bufferSize value="512" />
<lossy value="false" /> <!-- important! -->
<to value="[email protected]" />
<from value="[email protected]" />
<subject value="ERROR: subject" />
<smtpHost value="smtpserver" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="ErrorHolder" />
<appender-ref ref="Email" />
</root>
Al final de la aplicación ejecutar esta opción para desactivar el SmtpAppender
si el ErrorHolder
appender está vacía:
// trigger loggers if errors occurred:
var memoryAppender = ((Hierarchy)LogManager.GetRepository())
.Root.Appenders.OfType<MemoryAppender>().FirstOrDefault();
if (memoryAppender != null && memoryAppender.GetEvents().Length == 0)
{
// there was no error so don't email anything
var smtpAppender = ((Hierarchy)LogManager.GetRepository())
.Root.Appenders.OfType<SmtpAppender>().FirstOrDefault();
if (smtpAppender != null)
{
smtpAppender.Threshold = Level.Off;
smtpAppender.ActivateOptions();
}
}
Esta parece ser una versión bastante compleja de lo que sugerí en mi solución. – IAmTimCorey
Eso es correcto, tenías razón. Tuve tu idea de verificar al final, eso es verdad. Pero cuando se busca cómo mirar dentro de los appenders para ciertas ocurrencias de nivel (estar aquí). No pude encontrar nada con respecto a los appenders si pudiera obtener los eventos dentro de ellos. Entonces, el único que pude encontrar es un MemoryAppender y lo usé. –
Aquí hay una publicación sobre el seguimiento de los problemas de log4net: http://stackoverflow.com/questions/756125/how-to-track-down-log4net-problems – Nickz