gpt4 book ai didi

.net - 使用 ELK 堆栈进行应用程序日志记录

转载 作者:行者123 更新时间:2023-12-04 14:40:49 28 4
gpt4 key购买 nike

将 NLog 与 Elasticsearch target 一起使用将日志转发到 AWS Elasticsearch as a Service Kibana 中的可视化集群。

这工作正常,但由于 ES 集群可用性和集群故障转移的影响,当使用 elasticsearch-net client 发送日志时,我担心在生产中使用它。通过 HTTP。

我正在考虑为 NLog 使用不同的目标,将日志发送到更可靠的目的地(文件、S3?)然后让其他东西(Logstash、AWS Lambda)接收它们并将它们发送到 ES,这样可以最大限度地降低风险应用程序本身。

想听听你的想法

更新

主要关注的是应用程序可用性并使用次要目标来防止丢失日志。

使用最新的 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"的 elasticsearch 目标使用异步包装器

    问:
  • 是否创建了另一个线程 [B]?
  • 后续请求会重用线程 [B] 并将日志记录请求排队吗?
  • 当达到 queueLimit 时会发生什么?
  • 是否会启动其他线程 [B1 ... Bn]? (这将淹没连接池)
  • 最佳答案

    好问题。

    没什么可担心的,但正确配置 NLog 很重要。

    不确定什么应该可靠,运行程序或不丢失日志消息,因此对于这些情况:

  • 如果你害怕丢失一些日志信息
  • 写入多个目标(来自 NLog),例如文件 Elasticsearch 。
  • 可选,使用 fallbackgroupwrapper(以防写入目标时出错)
  • 如果启用异步,check the overflow/queue settings - 默认情况下启用丢弃(以防止 CPU 或内存过载)
  • 如果您担心日志记录会破坏您的应用程序:
  • 使用最新稳定版NLog
  • 不启用 throwExceptions (默认禁用)
  • 如果您启用 async ,错误将写入另一个线程中的目标,因此它不会破坏您的应用程序。
  • 同样在使用 async 时, check the overflow and queue settings

  • 更新

    情况1,

    what happens with the main thread when target can't be reached?



    没有。主要在缓冲区中排队消息。另一个( Timer )线程正在处理这些消息。如果那会失败,还有 throwException未启用,只会将错误写入 internalLog(启用时)。所有异常都会被捕获。写入目标失败时,您将丢失消息。

    案例2,

    is another thread[B] created ?



    Timer 将被创建。这将创建一个线程来处理消息。

    will subsequent requests reuse thread [B] and queue the logging requests?



    是的,但不能保证它会是同一个线程。计时器将从池中创建一个线程。注意:只有一个线程同时处于事件状态。

    what happens when the queueLimit is reached?



    取决于你的配置。默认情况下,它会默认丢弃,如上所述。见 check the overflow/queue settings .就内存和 CPU 而言,这是最安全的选择。您可以选择丢弃、阻塞(停止主线程)或增加队列(通过了解内存使用情况)。

    will additional threads [B1 ... Bn] be started? (this will flood connection pool)



    1 号定时器,1 个线程池。详情请查看 MSDN page for Timer ,或 reference source .

    关于.net - 使用 ELK 堆栈进行应用程序日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40807162/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com