【发布时间】:2017-04-09 23:35:34
【问题描述】:
使用 NLog 和 Elasticsearch target 将日志转发到 AWS Elasticsearch as a Service 集群,以便在 Kibana 中进行可视化。
这工作正常,但由于 ES 集群可用性和集群故障转移的影响,当日志通过 HTTP 使用 elasticsearch-net client 发送时,我担心在生产中使用它。
我正在考虑为 NLog 使用不同的目标,将日志发送到更可靠的目的地(文件、S3?),然后让其他东西(Logstash、AWS Lambda)接收它们并将它们发送到 ES,这样可以最大限度地减少应用程序本身的风险。
想听听你的想法
更新
主要关注的是应用可用性,并使用辅助目标来防止丢失日志。
Using latest 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>
问:
- 当无法达到目标时,主线程会发生什么?
案例 2 - 带有异步目标的 NLog
对带有 queueLimit="10000" batchSize="100" 的弹性搜索目标使用异步包装器
问:
- 是否创建了另一个线程[B]?
- 后续请求是否会重用线程 [B] 并对日志记录请求进行排队?
- 达到 queueLimit 时会发生什么?
- 是否会启动其他线程 [B1 ... Bn]? (这将淹没连接池)
【问题讨论】:
标签: .net amazon-s3 scalability nlog elastic-stack