在。NET应用程序中使用ELK


本文是关于在dotnet中构建分布式系统的现代工具和技术的系列文章的一部分。

在我们的first article,我们看到通过利用预先构建的容器来设置完整的ELK堆栈是多么容易。如果您还没有联机和配置您的ELK服务器,请按照中的教程进行操作Containers For.NET Developers

在本博客中,我将展示如何在。NET应用程序中利用ELK(Elastic)并将日志聚合到一个单独的位置。您将看到开始了解应用程序是多么简单。

正在收集日志


在深入讨论细节之前,让我们首先谈谈为什么要将应用程序日志聚合在一起。随着我们继续构建更多的分布式系统,如果我们必须为我们运行的每个服务去不同的位置,那么了解哪里存在错误就会变得像是争吵的猫。

通过将我们的日志聚合在一起,我们可以更统一地了解我们的整个系统集合的健康状况是什么。对于系统来说,只有一个真实的来源也有助于对一段时间内的服务健康状况进行详细的分析。它还可以让我们在终端消费者之前发现影响他们的问题,这样我们就可以在支持请求之前保持领先。

为什么选择麋鹿

对我来说最主要的原因是易用性和互操作性。话虽如此,但也有一些不利之处。也就是说,您必须在您的组织中拥有您的日志记录。您必须自己知道如何理解日志的KPI。您还必须拥有与维护相关的所有基础设施。有时那是没有好处的,尤其是从时间和金钱的角度来看。我们都知道时间等于金钱,所以如果一件事需要时间和金钱,那么它就需要金钱

如果您不想花费大量时间构建这种基础设施,我建议您使用类似于Operations Management Suite,Stackify,或NewRelic这些预先制定的解决方案将大大简化从地面起飞时的开销,特别是在现有的Ops方案中。

还有一些原因,你可能想要承担这个责任;值得注意的例子是控制遵从性,如HIPAA,SOX,PCI等。同样,当涉及到系统健康时,您可能对组织的成功有非常明确的概念,因此您希望拥有与拥有/操作内部日志聚合解决方案相伴随的商业智能。

底线:为工作选择合适的工具。

让我们开始吧

对于本例,我们将使用log4net elastic extension

首先创建一个新的控制台应用程序。


现在添加log4net弹性搜索Nuget包。

将以下代码部分添加到应用程序的App.config

请注意,您的计算机上的端口将不同。您需要映射到容器内部端口9200的端口。在我的例子中,该端口是32769。

对于本教程,我们不打算做滚动推送。但是在生产环境中,这将使用Bulk API进行Elastic,这将更有效。

注意绑定重定向,并确保您在新版本中拥有适当版本的log4net。版本将随着时间的推移而更新,因此本教程中的内容可能不是1-1正确的。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.8.0" newVersion="2.0.8.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>  
  <log4net>
    <appender name="ElasticSearchAppender" type="log4net.ElasticSearch.ElasticSearchAppender, log4net.ElasticSearch">      
      <connectionString value="Server=localhost;Index=log;Port=32769;" />
      <bufferSize value="0" />
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="ElasticSearchAppender" />
    </root>
  </log4net>
</configuration>


从配置的角度来看,最后一步是让应用程序知道检查XML配置是否有log4net更改。打开您的assemblies.cs文件并添加此行:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

 

编辑程序集:

将程序更改为:

class Program
    {
        private static readonly ILog _log = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args)
        {
            _log.Error("kaboom!", new ApplicationException("The application exploded"));
        }
    }


您可以通过运行您的应用程序,然后导航到我们前面设置的端点到Elastic,然后附加_cat/indices?v

在我看来http://localhost:32769/_cat/indices?v

本页将向您展示Elastic当前对哪些索引进行了编目。你要找的就是我们之前定义的那个,log

设置基班纳

我们将需要向Kibana添加一个索引模式来使用新的日志度量。导航到Kibana门户。在我的计算机上,它被映射到32770;您的机器上可能会有不同的情况。您正在查找内部端口5601的外部映射。

在门户中,单击Management。然后索引模式。

添加索引日志*,然后您应该能够下拉通过属性并选择时间戳。

最后,转到Kibana中的Discover选项卡。您应该从应用程序中看到日志条目。

成功!

很容易吧?我希望这说明了开始了解应用程序是多么简单。

随着本系列的继续,我们将使用类似的技术以及OWIN中间件来为您的生产环境创建更健壮的解决方案。在本系列的下一部分中,我们将在基础设施集合中添加一个新容器,以便使用Zipkin深入了解跨服务调用。