2010-10-30 9 views
9

Ich habe gerade angefangen, mit Log4Net herumzuspielen ... Ich möchte jetzt eine E-Mail mit dem vollständigen Protokoll entweder anhängen oder direkt in der Mail senden. Das Problem bei der Verwendung von SmtpAppender ist, dass es eine pufferSize benötigt, die unbekannt ist, weil sie die Mail senden sollte, ob sie voller Fehler oder nur Informationen ist.Log4Net + E-Mail senden, wenn Sie fertig sind?

Update: Meine Konfigurationsdatei

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"> 

    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject value="Backup Application - Log" /> 
    <smtpHost value="mailserver" /> 
    <authentication value="1" /> 
    <username value="userName" /> 
    <password value="mypw" /> 

    <port value ="25"/> 
    <lossy value="true" /> 
    <bufferSize value="500" /> 

    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="ALL"/> 
    </evaluator> 

    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%timestamp [%thread] %-5level %logger – %message%newline" /> 
    </layout> 

</appender> 

Antwort

16

Buffer entspricht die Anzahl der Log-Meldungen, die gepuffert werden müssen (dh, wenn Sie gesammelt wurden auf 512 wird die E-Mail, sobald 512 Nachrichten gesendet werden) .

Ich glaube, dass es eine vernünftige Wahl ist, es auf int.MaxValue (das ist 2.147.483.647) zu setzen. 2 Milliarden Nachrichten sind zu viel für ein System, sogar für eine lange Laufzeit.

Wenn Sie mich 10 Minuten gebe ich werde Sie bestätigen (von Quellcode), dass, wenn Sie sauber Ihre Anwendung beenden, werden alle bisher gesammelten Protokolle

[Update] gesendet werden: bestätigt! ! Destructor löscht die Warteschlange wie erwartet

[Hinzufügen] Ich würde sowohl verlustbehaftet als auch Evaluator entfernen. Ihr Problem ist klar: Evaluator hat Vorrang vor Puffer :) :)

Der Evaluator wird verwendet, um die Warteschlange zu leeren, wenn eine bestimmte Bedingung erfüllt ist. Ihre Bedingung entspricht true. Wenn diese Bedingung ausgelöst wird, wird die E-Mail gesendet. Aus diesem Grund wird die E-Mail bei jedem einzelnen Protokollanruf gesendet.

Dies ist etwas anders von senden nur Informationen und Fehlermeldungen, die durch Protokoll-Filterung erreicht wird.

Entfernen Sie die beiden Attribute und Ihr Code wird funktionieren. Mit int.MaxValue können Sie die maximal mögliche Anzahl an Nachrichten speichern. Es ist unwahrscheinlich (Sie sollten besser den 178 Millionen € Jackpot von Superenalotto gewinnen, wie einige Leute heute Abend, oder von einem Kometen in Ihrem Kopf getroffen), dass eine Anwendung mehr als 2 Milliarden Fehler/Informationen in einem Lauf sammelt.

+0

Ich denke, das ist das Problem .. Ich nicht "sauber" stop meine Anwendung (nicht wissen, wie?) – ebb

+0

Wenn Ihre Anwendung abstürzt, unterliegen Sie Nachricht Verlust. Dies ist ein sehr häufiges Problem bei der allgemeinen Protokollierung. Aus diesem Grund sollten Sie ** immer ** vermeiden, Nachrichten in einer fehlerhaften Anwendung zu puffern. Übrigens ist ein "sauberer" Stopp ein Stopp ohne unbehandelte Ausnahme. Wenn Sie Ihre Hauptmethode versuchen zu fangen, wird es ein sauberer Halt, wenn Sie einen Fehler –

+0

Ich try-catch verwenden. Aber das Problem ist, dass ich immer noch möchte, dass das Protokoll per Mail gesendet wird, ob es voller Fehler oder nur Informationen ist. – ebb

Verwandte Themen