2017-09-12 2 views
0

Ich habe eine SmtpAppender wie folgt aus:ändern Thema SmtpAppender programmatisch

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"> 
    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject type="log4net.Util.PatternString" value="This is a subject" /> 
    <smtpHost value="smtp.host.value" /> 
    <authentication value="Basic" /> 
    <port value="587" /> 
    <username value="Username" /> 
    <password value="Password" /> 
    <bufferSize value="1" /> 
    <EnableSsl value="true"/> 
    <lossy value="false" /> 
    <threshold value="ERROR" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%3thread] %-5level [%class].[%method] - %message%newline" /> 
    </layout> 
</appender> 

Ich möchte das Thema der Log-Mail an eine Zeichenfolge in der Code geändert würde ich angeben, so passt es meine Bedürfnisse besser als ein Standard-Thema.

Im Moment erreiche ich es so. Erstens finde ich die SmtpAppender nach Namen:

public static IAppender FindAppenderByName(string name) { 
    ILoggerRepository rootRep = LogManager.GetRepository(); 
    foreach (IAppender iApp in rootRep.GetAppenders()) { 
     if (string.Compare(name, iApp.Name, true) == 0) { 
      return iApp; 
     } 
    } 
    return null; 
} 

und dann kann ich das Thema wie folgt ändern:

IAppender appender = FindAppenderByName("SmtpAppender"); 
SmtpAppender smtpAppender = (SmtpAppender)appender; 
smtpAppender.Subject = "An error occured trying to convert the values"; 
log.Error("Error message"); 

aber dies scheint ein bisschen zu kompliziert zu sein, da jedes Mal, wenn ich einen Fehler Mail senden Ich muss zuerst den Appender mit Namen finden und ich möchte kein globales IAppender Objekt verwenden, und das scheint mir eine schlechte Übung zu sein.

Gibt es eine Möglichkeit, die benutzerdefinierte Fehlermeldung als Betreff zu verwenden oder gibt es eine Erweiterungsmethode, die ich verwenden könnte?

Antwort

0

Mein Vorschlag lautet wie folgt:

  • Erstellen Sie eine neue Klasse erweitern SmtpAppender
  • Aufschalten Sendepuffer
  • Basierend auf Ihren LogginEvent, dynamisch ändern die base.Subject

    public class CustomSmtpAppender : SmtpAppender 
    { 
        protected override void SendBuffer(LoggingEvent[] events) 
        { 
         PrepareSubject(events); 
         base.SendBuffer(events); 
        } 
    
        protected virtual void PrepareSubject(IEnumerable<LoggingEvent> events) 
        { 
         //here you can eval events and set base.Subject 
        } 
    } 
    
+0

Wie kann ich den SendBuffer überschreiben? Ich habe es versucht, konnte aber keine Lösung finden. – waka

+0

@waka Sie können beispielsweise den Typ des Ausnahmeobjekts überprüfen, das zur Initialisierung dieses Ereignisses verwendet wird. Sie können auch die Protokollnachricht überprüfen, aber diese Lösung scheint mir ein wenig schmutzig zu sein. – jBravo