Использование NLog с Elasticsearch target для пересылки журналов в AWS Elasticsearch as a Service кластер для визуализации в Кибане.Регистрация приложений с помощью стека ELK
Это работает нормально, но я заинтересован в том, чтобы использовать его в процессе производства из-за доступности кластера ES и последствий отказоустойчивости кластера, когда журналы отправляются с использованием elasticsearch-net client через HTTP.
Я рассматриваю возможность использования другой цели для NLog, которая отправляет журналы в более надежный пункт назначения (файл, S3?), А затем имеет что-то другое (Logstash, AWS Lambda), забирает их и отправляет их в ES, таким образом минимизации рисков для самого приложения.
хотел бы услышать ваши мысли
UPDATE
основной проблемой является наличие приложений и предотвратить недостающие журналы используется вторичная цель.
Использование последних значений NLog и throwExceptions установлено в false и не использует асинхронные цели на данный момент, но учитывая это, поскольку у нас много асинхронного кода.
Чтобы дать немного больше контекста, «приложение» представляет собой набор API (WebAPI и WCF), которые получают 10 - 15K RPM.
Сценарий
Запрос приходит и ES кластер недоступен.
Случай 1 - NLog без цели асинхронной
<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:
- , что происходит с главным потоком, когда цель не может быть достигнута?
Случай 2 - NLog с целевым асинхронным
Использованием асинхронной обертки для elasticsearch мишени с queueLimit = "10000" BATCHSIZE = "100"
В:
- является еще одним поток [B] создан?
- будет выполнять последующие запросы повторно использовать поток [B] и ставить очереди на запросы регистрации?
- Что происходит, когда достигается очередь queueLimit?
- будет запущен дополнительный поток [B1 ... Bn]? (это будет пул подключений)
Не учитывал флаг throwExceptions. Спасибо что подметил это! Я обновил вопрос, не могли бы вы еще раз взглянуть? – thedev