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)
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