2016-11-25 6 views
2

Verwenden von NLog mit Elasticsearch target zum Weiterleiten von Protokollen an AWS Elasticsearch as a Service Cluster für Visualisierungen in Kibana.Anwendungsprotokollierung mit dem ELK-Stack

Dies funktioniert gut, aber ich bin besorgt über die Verwendung in der Produktion aufgrund der Verfügbarkeit von ES-Clustern und die Auswirkungen eines Cluster-Failovers, wenn die Protokolle mit der elasticsearch-net client über HTTP gesendet werden.

Ich überlege, ein anderes Ziel für NLog zu verwenden, das die Protokolle an ein zuverlässigeres Ziel sendet (File, S3?) Und dann etwas anderes (Logstash, AWS Lambda) übernimmt und sie auf diese Weise an ES sendet Minimierung von Risiken für die Anwendung selbst

Möchten Sie Ihre Gedanken

UPDATE

Hauptanliegen ist App die Verfügbarkeit hören und fehlende Protokolle sekundäre Ziel verwendet wird, um zu verhindern.

Die Verwendung der letzten NLog und throwExceptions wird auf false gesetzt und verwendet keine asynchronen Ziele an dieser Stelle, aber in Anbetracht dessen, dass wir viel Async-Code haben.

Um ein bisschen mehr Kontext zu geben, ist die "App" eine Reihe von APIs (WebAPI und WCF), die 10 - 15K RPM bekommen.

Szenario

Anfrage kommt und ES-Cluster ist nicht verfügbar.

Fall 1 - NLog ohne async Ziel

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" 
     autoReload="true" 
     throwExceptions="false" 
     internalLogLevel="Off" 
     internalLogFile="c:\temp\nlog-internal.log"> 

    <targets> 
     <target name="elastic" 
       xsi:type="BufferingWrapper" 
       flushTimeout="5000"> 
     <target xsi:type="ElasticSearch" 
       layout="${logger} | ${threadid} | ${message}" 
       index="logstash-${date:format=yyyy.MM.dd}" 
       includeAllProperties="true" 
       uri="..."> 

      <field name="user" 
       layout="${windows-identity:userName=True:domain=False}"/> 
      <field name="host" 
       layout="${machinename}"/> 
      <field name="number" 
       layout="1" 
       layoutType="System.Int32"/> 

     </target> 
     </target> 
    </targets> 
    <rules> 
     <logger name="*" 
       minlevel="Debug" 
       writeTo="elastic" /> 
    </rules> 
    </nlog> 

Q:

  • , was mit dem Haupt-Thread geschieht, wenn das Ziel nicht erreicht werden kann?

Fall 2 - NLog mit async Ziel

async wrapper mit queueLimit für Elasticsearch-Target = "10000" batchsize = "100"

Q:

  • ist ein anderes Thread [B] erstellt?
  • werden nachfolgende Anfragen Thread [B] wiederverwenden und die Logging-Anfragen in die Warteschlange stellen?
  • Was passiert, wenn das queueLimit erreicht wird?
  • werden zusätzliche Threads [B1 ... Bn] gestartet? (das flutet Verbindungspool)

Antwort

5

Gute Frage.

Es gibt nichts, worüber Sie sich Sorgen machen müssen, aber die korrekte Konfiguration von NLog ist wichtig.

nicht sicher, was zuverlässig sein sollte, das Programm läuft oder nicht eine Log-Nachricht zu verlieren, so dass für diese Fälle:

  • Wenn Sie Angst haben, wenn Sie einige Protokollmeldungen verlieren

    • schreiben zu mehreren Zielen (von NLog), z Datei und Elasticsearch.
    • Optional, verwenden Sie einen fallbackgroupwrapper (im Fall eines Fehlers, wenn an das Ziel Schreiben)
    • Wenn async aktiviert ist, check the overflow/queue settings - Verwerfen standardmäßig aktiviert ist
  • (von der CPU oder der Speicherüberlastung zu schützen)

    Wenn Sie Angst, dass die Protokollierung der Anwendung brechen könnte:

    • die neueste stabile Version von NLog verwenden (4.3)
    • nicht throwExceptions aktivieren Sie (durch d deaktiviert efault)
    • Wenn Sie async aktivieren, werden die Fehler auf das Ziel in einem anderen Thread geschrieben, sodass Ihre App nicht beschädigt werden konnte.
    • Auch wenn async Verwendung check the overflow and queue settings

aktualisieren

Im Idealfall sollte dieser separate Stackoverflow Fragen sein;)

Fall 1,

was mit passiert, der Mai n Thread, wenn das Ziel nicht erreicht werden kann?

Nichts. Die Hauptwarteschlange speichert die Nachrichten in einem Puffer. Ein anderer (Timer) Thread verarbeitet diese Nachrichten. Wenn dies fehlschlägt und throwException nicht aktiviert ist, werden nur Fehler in den internen Log geschrieben (wenn aktiviert). Alle Ausnahmen werden abgefangen. Sie verlieren die Nachricht, wenn das Schreiben auf das Ziel fehlschlägt.

Fall 2,

ist ein anderer Thread [B] geschaffen?

Ein Timer wird erstellt. Dadurch wird ein Thread für die Verarbeitung der Nachricht erstellt.

Werden nachfolgende Anfragen den Thread [B] erneut verwenden und die Logging-Anfragen in die Warteschlange stellen?

Ja, aber keine Garantie, es wird der gleiche Thread. Der Timer erstellt einen Thread aus dem Pool. NB: Nur ein Thread wird gleichzeitig aktiv sein.

Was passiert, wenn das queueLimit erreicht wird?

Hängt von Ihrer Konfiguration ab. Standardmäßig wird es standardmäßig wie oben angegeben verworfen. Siehe check the overflow/queue settings. Dies ist die sicherste Option in Bezug auf Speicher und CPU. Sie können wählen, zu verwerfen, zu blockieren (stoppt den Hauptthread) oder die Warteschlange gewachsen (durch Berücksichtigung der Speicherbelegung).

werden zusätzliche Threads [B1 ... Bn] gestartet? (dies flutet den Verbindungspool)

Nr. 1 Timer, 1 Threadpool. Für Details überprüfen Sie die MSDN page for Timer, oder die reference source.

+0

Das throwExceptions-Flag wurde nicht berücksichtigt. Danke, dass du das unterstrichen hast! Ich habe die Frage aktualisiert, können Sie bitte noch einen Blick darauf werfen? – thedev