如何使用Kibana的奥迪q5仪表板使用说明与可视化功能

君,已阅读到文档的结尾了呢~~
kibana中文指南
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
kibana中文指南
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据
时间: 21:03:24
&&&& 阅读:207
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&想要轻松地通过许多不同的方式查询数据,甚至是从未预料到的方式?想要以多种方式可视化日志?同时支持基于时间、文本和其他类型的即时过滤器?借助于&Elastic&stack 的卓越性能和可扩展方式的优点,我们将通过两个示例轻松实现。本文由&DNC Magazine for Developers and Architects&发布。&[PDF] 或&&下载所有以前和当前的版本版本。在这篇文章中,我将介绍流行的搜索引擎 Elasticsearch,其配套的可视化应用 Kibana,并展示如何对.NET核心可以轻松地与 Elastic stack 整合在一块。Elasticsearch和.Net Core我们将开始探索 Elasticsearch 的 REST API ,通过索引和查询某些数据。接着,我们将使用Elasticsearch官方的 .Net API 完成类似的练习。一旦熟悉 Elasticsearch 及其 API 后,我们将使用 .Net Core 创建一个日志模块,并将数据发送到 Elasticsearch 。Kibana紧随其中,以有趣的方式可视化 Elasticsearch 的索引数据。我迫切希望你会认为这篇文章十分有趣,并且想要了解更多关于Elastic的强大之处。本文假设您已经了解 C#和 REST API 的基本知识。使用 Visual Studio,Postman 和 Docker 等工具,但您可以轻松使用 VS Code 和 Fiddler 等替代方案。Elasticsearch - 简介Elasticsearch 作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST API 来搜索数据。它使用 Java 编写,基于&,尽管这些细节隐藏在 API 中。通过被索引的字段,可以用许多不同的聚合方式找到任何被存储(索引)的文档。但是,ElasticSearch不仅仅只提供对这些被索引文档的强大搜索功能。快速、分布式、水平扩展,支持实时文档存储和分析,支持数百台服务器和 PB 级索引数据。同时作为 Elastic stack (aka ELK) 的核心,提供了诸如 LogStash、Kibana 和更多的强大应用。Kibana&是 Elasticsearch 中专门提供强有力的可视化查询Web应用程序。使用Kibana,能非常简单地为 Elasticsearch 中索引的数据创建查询、图表和仪表盘。Elasticsearch开放了一个 REST API,你会发现许多文档示例是 HTTP 调用,你可以尝试使用 curl 或 postman 等工具。当然,这个 API 的客户端已经用许多不同的语言编写,包括.Net、Java、Python、Ruby和JavaScript等。如果你想阅读更多,Elasticsearch&&可能是最好的地方。Docker是在本地运行的最简方式在这篇文章中,我们需要先连接到一个 Elasticsearch (和后面的Kibana)的服务器。如果您已经有一个在本地运行或可以使用的服务器,那很好。否则需要先搭建一个服务器。您可以选择在您的本地机器或可以使用的 VM 或服务器中下载和安装 Elasticsearch 和 Kibana 。不过,建议您使用最简单最纯粹的方式,使用Docker 搭建 Elasticsearch 和 Kibana 。您可以直接运行以下命令,获取包含Elasticsearch和Kibana的容器。docker&run&-it&--rm&-p&&-p&&--name&esk&nshou/elasticsearch-kibana-it 表示以交互模式启动容器,并附加到终端。--rm 表示从终端退出后,容器将被移除。-p 将容器中的端口映射到主机中的端口--name 给容器一个名称,当您不使用的情况下可以用 --rm 手动停止/删除nshou/elasticsearch-kibana 是&中的一个镜像的名称,已经有人帮你准备好了Elasticsearch和Kibana如果你喜欢在后台运行的话,你可以使用参数-d 代替 --it --rm,并且手动停止/删除容器。在同一个容器中运行多个应用程序,就像我们现在这种做法,非常适用本文,但不是推荐用于生产容器!您应该意识到,一旦你删除容器,你的数据就会消失(一旦你使用-rm选项就删除它了)。虽然有利于本地实验,但在实际环境中,如果您不想丢失数据,请参照 "data container" 模式。Docker是一个很棒的工具,我鼓励你更多地了解它,特别是如果你想做更重要的事情,而不仅仅是跟随本文,在本地快速搭建 Elasticsearch 服务器。在之前的文章&&中已经对 .NET Core 搭配 Docker 有很好的介绍。只需打开&&和&&,检查Elasticsearch 和 Kibana 是否都可以使用。(如果您使用docker toolbox,请使用托管Docker的虚拟机ip替换localhost,您可以在命令行中运行 docker-machine env default )。在docker中运行 Elasticsearchkibana也准备好了在 Elasticsearch 中索引和查询在我们开始编写任何 .Net 代码之前,我们先了解一下一些基本知识。先在 Elasticsearch 索引一些文档(类似于存到数据库),以便我们对它们运行不同的查询。在这里,我将使用Postman向我们的 Elasticsearch 服务器发送 HTTP 请求,但您可以使用任何其他类似的工具,如&或&&。我们要做的第一件事是请求 Elasticsearch 创建一个新的索引 (译者语:类似创建一个表) 并索引一些文档 (译者语:类似于在数据中插入数据) 。这类似于将数据存储在表/集合中,主要区别(和目的)是让 Elasticsearch 集群 (这里只是一个节点) 可以分析和搜索文档数据。被索引的文档在 Elasticsearch 中以索引和类型进行组织。以往,被拿来和数据库表做对比,往往会令人困惑。如所述,索引由Lucene处理,在分布式跨&分片&中,与类型紧密地联系在一起。发送以下两个请求以创建索引,并在该索引中插入文档 (请记住 toolbox,如果使用docker ,请使用托管Docker的虚拟机ip而不是localhost) :创建一个名为 "default" 的新索引。PUT&localhost:9200/default在 "default" 索引中索引文档。请注意,我们需要知道我们存储哪种类型的文档("product")和该文档的ID (如 1,尽管您可以使用任何值,只要它是唯一的)PUT&localhost:9200/default/product/1
&&&&"name":&"Apple&MacBook&Pro",
&&&&"description":&"Latest&MacBook&Pro&13",
&&&&"tags":&["laptops",&"mac"]
}创建一个新索引索引新文档在我们验证搜索功能和查询数据之前,再索引几个 "product"。尝试使用不同的 "tags",如 "laptops"和 "laptops",并记得使用不同的ids!完成后,让我们按名称排序的搜索所有被索引的文档。您可以使用查询字符串或 GET/POST 同样的内容,下面两个请求是等效的:GET&http://localhost:9200/default/_search?q=*&sort=name.keyword:ascPOST&http://localhost:9200/default/_search
&&"query":&{&"match_all":&{}&},
&&"sort":&[
&&&&{&"name.keyword":&"asc"&}
}让我们尝试一些更有趣的东西,例如搜索 "description" 字段中含有 "latest" ,同时 "tags" 字段中含有 "laptops" 的所有文档:POST&http://localhost:9200/default/_search
&&"query":&{&
&&&&&&"bool":&{
&&&&&&"must":&[
&&&&&&&&{&"match":&{"description":&"latest"}&},
&&&&&&&&{&"match":&{&"tags":&"laptops"&}&}
&&"sort":&[
&&&&{&"name.keyword":&"asc"&}
}搜索结果Kibana 可视化数据作为介绍的最后部分,我们将对 Kibana 的相关知识蜻蜓点水。假设您在上一步已经索引了几个文档,通过访问&&中打开在 Docker 的 Kibana 服务器。你会注意到,Kibana 要求你提供默认的索引模式,所以必须告诉它使用的 Elasticsearch 索引:我们在上一节中创建了一个名为 "default" 的索引,因此可以使用&"default"&作为索引模式。您还需要取消 "索引包含基于时间的事件 (Index contains time-based events ) " 选项,因为我们的文档不包含任何时间字段。在 Kibana 中添加索引模式完成后,使用左侧菜单打开 " 发现 (Discover) " 页面,您应该会看到上一节中插入的所有最新文档。尝试选择不同的字段,在搜索栏中输入相关的字段或某个过滤器:在 kibana 中可视化数据最后,我们创建一个饼图,显示 "laptops" 或 "desktops" 的销量百分比。利用之前索引的数据,在左侧菜单新建一个 "饼图 (Pie Chart)" 。您可以在 饼图 (Pie Chart)的页面上配置。将 " Count " 作为切片的大小,并在 " buckets " 部分中选择 " split slices " 。将 " filters " 作为聚合类型,添加两个过滤器:tags ="laptop" 和 tags ="desktoptops" 。单击运行,您将看到类似于下图:在Kibana中创建饼图确保在搜索栏中输入包含已过滤的项目的搜索关键词,并注意到可视化图形如何变化。Elasticsearch .Net API在简要介绍Elasticsearch和Kibana之后,我们来看看我们如何用 .Net 应用程序索引和查询我们的文档。您可能想知道为什么要这样做,而不是直接使用 HTTP API 。我可以提供几个理由,我相信你可以自己找几个:你不想直接暴露 Elasticsearch 集群Elasticsearch 可能不是您的主数据库,您可能需要结合来自主数据库的结果。你希望包含来自存储/生产服务器中的被索引文档首先需要注意的是打开&&,有两个官方提供的 APIs :&Elasticsearch.Net&和&NEST&,都支持 .Net Core 项目。Elasticsearch.Net 提供了一个用于与 Elasticsearch连接的低级API,提供构建/处理请求和响应的功能。它是 .Net 瘦客户端。NEST 在 Elasticsearch.Net 之上,提供了更高级别的 API 。它可以将对象映射到请求/响应中,提供强大查询功能,将索引名称、文档类型、字段类型用于构建与 HTTP REST API 的匹配查询。Elasticsearch .Net API由于我使用的是 NEST,所以第一步是创建一个新的 ASP .Net Core 应用程序,并使用 Package Manager 安装NEST。使用Nest开始索引数据我们将在新的 ASP.Net Core 应用程序中完成之前手动发送 HTTP 请求的一些步骤。如果需要,请重新启Docker 容器,从而清理数据;或通过 HTTP API 和 Postman 手动删除文档/索引。我们首先为产品创建一个POCO模型:public&class&Product
&&&&public&Guid&Id&{&&&}
&&&&public&string&Name&{&&&}
&&&&public&string&Description&{&&&}
&&&&public&string[]&Tags&{&&&}&&&&&&&&
}接下来,我们创建一个新的控制器 ProductController,它具有添加新的 "Product" 的方法和基于单个关键词查找 "Product" 的方法:[Route("api/[controller]")]
public&class&ProductController&:&Controller
&&&&[HttpPost]
&&&&public&async&Task&&IActionResult&&&Create([FromBody]Product&product)
&&&&[HttpGet("find")]
&&&&public&async&Task&&IActionResult&&&Find(string&term)
}为了实现这些方法,我们需要先连接到 Elasticsearch。这里有一个 ElasticClient 连接的正确示范。 由于该类是线程安全的,所以推荐的方法是在应用程序中使用单例模式,而不是按请求创建新的连接。为了简洁起见,我现在将使用带有硬编码设置的私有静态变量。在 .Net Core 中使用依赖注入配置框架,或查看&&的代码。可以想到的是,至少需要提供被连接的 Elasticsearch 集群的URL。当然,还有其他可选参数,用于与您的群集进行身份验证、设置超时、连接池等。private&static&readonly&ConnectionSettings&connSettings&=
&&&&new&ConnectionSettings(new&Uri("http://localhost:9200/"));&&&&&&&&
private&static&readonly&ElasticClient&elasticClient&=&
&&&&new&ElasticClient(connSettings);建立连接后,索引文档只是简单地使用 ElasticClient 的Index/IndexAsync 方法:[Route("api/[controller]")]
public&class&ProductController&:&Controller
&&&&[HttpPost]
&&&&public&async&Task&IActionResult&&Create([FromBody]Product&product)
&&&&[HttpGet("find")]
&&&&public&async&Task&IActionResult&&Find(string&term)
}很简单,对吧?不幸的是,如果您向Postman发送以下请求,您将看到失败。POST&http://localhost:65113/api/product
&&&&"name":&"Dell&XPS&13",
&&&&"description":&"Latest&Dell&XPS&13",
&&&&"tags":&["laptops",&"windows"]
}这是因为NEST无法确定在索引文档时使用哪个索引!如果您想起手动使用 HTTP API 的做法,那么需要在URL指出文档的索引、文档的类型和ID,如&localhost:9200/default/product/1NEST能够推断文档的类型(使用类的名称),还可以默认对字段进行索引(基于字段的类型),但需要一些索引名称的帮助。您可以指定默认的索引名称,以及特定类型的特定索引名称。connSettings&=&new&ConnectionSettings(new&Uri("http://192.168.99.100:9200/"))
&&&&.DefaultIndex("default")
&&&&//Optionally&override&the&default&index&for&specific&types
&&&&.MapDefaultTypeIndices(m&=&&m
&&&&&&&&.Add(typeof(Product),&"default"));进行这些更改后再试一次。您将看到 NEST 创建索引(如果尚未存在),并将文档编入索引。如果你切换到 Kibana,你也可以看到该文档。需要注意的是:从类的名称推断文档类型,如 Product在类中将Id属性推断为标识将所有公开的属性发送到 Elasticsearch使用NEST索引的文档在我们查询数据之前,重新考虑创建索引的方式。如何创建索引?现在我们得到一个事实,即如果这个索引不存在,也会被创建。然而映射字段的索引方式很重要,并直接定义了 Elasticsearch 如何索引和分析这些字段。这对于字符串字段尤其明显,因为在 Elasticsearch v5 中提供了两种不同字段类型的 "Text" 和 "Keyword":Text 类型的字段将会被分析和分解成单词,以便用于更高级的 Elasticsearch 搜索功能另一方面,Keyword 字段将 "保持原样" 而不进行分析,只能通过其精确值进行搜索。您可以使用 NEST 索引映射属性来生成POCO模型:public&class&Product
&&&&public&Guid&Id&{&&&}
&&&&[Text(Name="name")]
&&&&public&string&Name&{&&&}
&&&&[Text(Name&=&"description")]
&&&&public&string&Description&{&&&}
&&&&[Keyword(Name&=&"tag")]
&&&&public&string[]&Tags&{&&&}&&&&&&&&
}然而,我们需要先创建索引,必须使用 ElasticClient API 手动创建和定义索引的映射。这是非常简单的,特别是如果我们只是使用属性:if&(!elasticClient.IndexExists("default").Exists)
&&&&elasticClient.CreateIndex("default",&i&=&&i
&&&&&&&&.Mappings(m&=&&m
&&&&&&&&&&&&.Map&Product&(ms&=&&ms.AutoMap())));
}直接向Elasticsearch发送请求(GET localhost:92000/default),并注意与我们想要的映射是否相同。使用NEST创建索引映射使用Nest查询数据现在,我们有一个使用 NEST 对 "products" 进行索引的 ProductController 控制器。是时候,为这个控制器添加 Find action,用于使用 NEST 向 Elasticsearch 查询文档。我们只是用到一个字段来实现一个简单的搜索。您应该观察所有字段:映射为&"Text"&类型的字段可以被分析,您可以在 "name" / "description" 字段内搜索特定的单词映射为&"Keywords"&的字段是保持原样的,未进行分析。您只能在 "tags" 字段中完全匹配。NEST 提供了一个查询 Elasticsearch 的丰富 API,可以转换成标准的 HTTP API 。实现上述查询类型与使用Search/SearchAsync方法一样简单,并构建一个 SimpleQueryString 作为参数。[HttpGet("find")]
public&async&Task&IActionResult&&Find(string&term)
&&&&var&res&=&await&elasticClient.SearchAsync&Product&(x&=&&x
&&&&&&&&.Query(&q&=&&q.
&&&&&&&&&&&&SimpleQueryString(qs&=&&qs.Query(term))));
&&&&if&(!res.IsValid)
&&&&&&&&throw&new&InvalidOperationException(res.DebugInformation);
&&&&return&Json(res.Documents);
}使用PostMan测试您的新操作:使用nest查询正如您可能已经意识到的那样,我们的操作行为与手动发送请求到 Elasticsearch 一样:GET&http://localhost:9200/default/_search?q=*&在 .Net Core 中创建一个Elasticsearch日志提供程序现在我们了解了 NEST 的一些基础知识,让我们尝试一些更有野心的事情。我们已经创建了一个 ASP.Net Core 的应用程序,借助.NET Core的日志框架,实现我们的日志提供程序,并将信息发送到Elasticsearch。新的日志 API 在日志 (logger) 和日志提供程序 (logger provider) 方面的区别:日志 (logger) 记录信息和事件,如用于控制器中可以为应用程序添加并启用多个日志提供程序 (provider) ,并可以配置独立的记录级别和记录相应的信息/事件。该日志框架内置了一些对事件日志、Azure 等的日志提供程序 (provider),但正如您将看到的,创建自己的并不复杂。有关详细信息,请查阅.NET Core 关于日志的。在本文的最后部分,我们将为Elasticsearch创建一个新的日志提供程序,在我们的应用程序中启用它,并使用Kibana来查看记录的事件。为Elasticsearch添加一个新的日志提供程序首先要做的是定义一个新的POCO对象,我们将使用它作为使用NEST进行索引的文档,类似于之前创建的 "Product" 类。这将包含有关可能发生的任何异常以及相关请求数据的记录信息、可选信息。记录请求数据将会派上用场,因为我们可以根据具体请求查询/可视化我们记录的事件。public&class&LogEntry
&&&&public&DateTime&DateTime&{&&&}
&&&&public&EventId&EventId&{&&&}
&&&&[Keyword]
&&&&[JsonConverter(typeof(StringEnumConverter))]
&&&&public&Microsoft.Extensions.Logging.LogLevel&Level&{&&&}
&&&&[Keyword]
&&&&public&string&Category&{&&&}
&&&&public&string&Message&{&&&}
&&&&[Keyword]
&&&&public&string&TraceIdentifier&{&&&}
&&&&[Keyword]
&&&&public&string&UserName&{&&&}&&&&&&&&
&&&&[Keyword]
&&&&public&string&ContentType&{&&&}
&&&&[Keyword]
&&&&public&string&Host&{&&&}&&&&&&&&&
&&&&[Keyword]
&&&&public&string&Method&{&&&}&&&&&&&&
&&&&[Keyword]
&&&&public&string&Protocol&{&&&}
&&&&[Keyword]
&&&&public&string&Scheme&{&&&}
&&&&public&string&Path&{&&&}
&&&&public&string&PathBase&{&&&}
&&&&public&string&QueryString&{&&&}
&&&&public&long?&ContentLength&{&&&}
&&&&public&bool&IsHttps&{&&&}
&&&&public&IRequestCookieCollection&Cookies&{&&&}
&&&&public&IHeaderDictionary&Headers&{&&&}
&&&&[Keyword]
&&&&public&string&ExceptionType&{&&&}&&&&&&&&
&&&&public&string&ExceptionMessage&{&&&}
&&&&public&string&Exception&{&&&}
&&&&public&bool&HasException&{&get&{&return&Exception&!=&&}&}
&&&&public&string&StackTrace&{&&&}
}下一步是在一个新类上实现ILogger接口。如您所想,这将需要记录的数据映射到一个新的 LogEntry 对象,并使用 ElasticClient 对其进行索引。我们将使用IHttpContextAccessor,以便我们可以获取当前的HttpContext并提取相关的请求属性。在这里就不写连接到Elasticsearch并创建索引的代码,这与之前的操作,没有什么不同。使用不同的索引或删除上一节中索引的 "products" 。注意:&您可以使用依赖注入和配置文检查中&的配套代码。实现的主要方法是Log &TState&,这是我们创建一个LogEntry并用NEST进行索引:public&void&Log&&TState&&(LogLevel&logLevel,&EventId&eventId,&TState&state,&Exception&exception,&Func&&TState,&Exception,&string&&&formatter)
&&&&if&(!IsEnabled(logLevel))&
&&&&var&message&=&formatter(state,&exception);
&&&&var&entry&=&new&LogEntry
&&&&&&&&EventId&=&eventId,
&&&&&&&&DateTime&=&DateTime.UtcNow,
&&&&&&&&Category&=&_categoryName,
&&&&&&&&Message&=&message,
&&&&&&&&Level&=&logLevel
&&&&var&context&=&_httpContextAccessor.HttpC
&&&&if&(context&!=&null)
&&&&{&&&&&&&&&&&&&&&&
&&&&&&&&entry.TraceIdentifier&=&context.TraceI
&&&&&&&&entry.UserName&=&context.User.Identity.N
&&&&&&&&var&request&=&context.R
&&&&&&&&entry.ContentLength&=&request.ContentL
&&&&&&&&entry.ContentType&=&request.ContentT
&&&&&&&&entry.Host&=&request.Host.V
&&&&&&&&entry.IsHttps&=&request.IsH
&&&&&&&&entry.Method&=&request.M
&&&&&&&&entry.Path&=&request.P
&&&&&&&&entry.PathBase&=&request.PathB
&&&&&&&&entry.Protocol&=&request.P
&&&&&&&&entry.QueryString&=&request.QueryString.V
&&&&&&&&entry.Scheme&=&request.S
&&&&&&&&entry.Cookies&=&request.C
&&&&&&&&entry.Headers&=&request.H
&&&&if&(exception&!=&null)
&&&&&&&&entry.Exception&=&exception.ToString();
&&&&&&&&entry.ExceptionMessage&=&exception.M
&&&&&&&&entry.ExceptionType&=&exception.GetType().N
&&&&&&&&entry.StackTrace&=&exception.StackT
&&&&elasticClient.Client.Index(entry);
}您还需要额外实现 BeginScope 和 IsEnabled 方法。为了本文的目的,忽略 BeginScope,只返回null。更新您的构造函数,以便它接收一个日志级别(LogLevel),如果接收到大于或等于构造函数中的日志级别,则实现 IsEnabled 并返回 true。你可能会问为什么需要分类?这是一个用于标识日志是哪种类型的字符串。默认情况下,每次注入ILogger &T&的实例时,该类别默认分配为T的分类名称。例如,获取ILogger &MyController&并使用它来记录某些事件,意味着这些事件将具有 "MyController " 名称。这可能派上用场,例如为不同的类设置不同的日志级别,以过滤/查询记录的事件。我相信您可能还想到更多的用法。这个类的实现将如下所示:public&class&ESLoggerProvider:&ILoggerProvider
&&&&private&readonly&IHttpContextAccessor&_httpContextA
&&&&private&readonly&FilterLoggerSettings&_
&&&&public&ESLoggerProvider(IServiceProvider&serviceProvider,&FilterLoggerSettings&filter&=&null)
&&&&&&&&_httpContextAccessor&=&serviceProvider.GetService&IHttpContextAccessor&();
&&&&&&&&_filter&=&filter&??&new&FilterLoggerSettings
&&&&&&&&&&&&{"*",&LogLevel.Warning}
&&&&&&&&};
&&&&public&ILogger&CreateLogger(string&categoryName)
&&&&&&&&return&new&ESLogger(_httpContextAccessor,&categoryName,&FindLevel(categoryName));
&&&&private&LogLevel&FindLevel(string&categoryName)
&&&&&&&&var&def&=&LogLevel.W
&&&&&&&&foreach&(var&s&in&_filter.Switches)
&&&&&&&&&&&&if&(categoryName.Contains(s.Key))
&&&&&&&&&&&&&&&&return&s.V
&&&&&&&&&&&&if&(s.Key&==&"*")
&&&&&&&&&&&&&&&&def&=&s.V
&&&&&&&&return&
&&&&public&void&Dispose()
}最后,我们创建一个扩展方法,可以用于在启动类中注册我们的日志提供程序:public&static&class&LoggerExtensions
&&&&public&static&ILoggerFactory&AddESLogger(this&ILoggerFactory&factory,&IServiceProvider&serviceProvider,&FilterLoggerSettings&filter&=&null)
&&&&&&&&factory.AddProvider(new&ESLoggerProvider(serviceProvider,&filter));
&&&&&&&&return&
public&void&Configure(IApplicationBuilder&app,&IHostingEnvironment&env,&ILoggerFactory&loggerFactory)
&&&&loggerFactory.AddConsole(Configuration.GetSection("Logging"))
&&&&&&&&.AddDebug()
&&&&&&&&.AddESLogger(app.ApplicationServices,&new&FilterLoggerSettings
&&&&&&&&&&&&{"*",&rmation}
&&&&&&&&});
}请注意我如何覆盖默认设置并按日志级别分类记录。这样,我们可以轻松地为每个请求索引一些事件。在Kibana中可视化数据现在我们已经在Kibana中记录了事件,我们来探索数据可视化吧!首先,在Kibana中重建索引,这次确保选择"&Index contains time-based events ( Index包含基于时间的事件 )",选择字段dateTime作为"Time-field name (时间字段名称)"。接下来,启动您的应用程序,浏览一些页面以获取一些事件日志。还可以在某个端点随意添加抛出异常的代码,以便我们可以看到被记录的异常数据。在这之后,请转到Kibana的&发现 (Discover)&页面,您可以看到由 "dateTime" 字段排序的多个事件(默认情况下,数据被过滤为最近15分钟,但您可以在右上角更改):Kibana可视化中记录的事件试着在搜索栏中输入 "exception",并注意任何一个被分析的文本字段中包含 "exception" 的事件。然后尝试搜索特定的异常类型(记住我们使用了一个关键字字段!)。您还可以尝试搜索特定的URL,如以 " /Home/About "和" /Home/About" 路径的两种搜索方式 。您会注意到第一种情况包括引用者是 "/Home/About" 的事件,而第二种情况则只能正确返回路径为 "/Home/About" 的事件。一旦你熟悉了数据,以及如何查询数据,那么可以用数据创建一些有趣的图形。首先,我们将创建一个图表,显示每分钟记录的异常数。转到Kibana的&可视化 (Visualize)&页面,并创建一个新的&垂直条形图 (Vertical bar chart)&。选择Y轴作为计数,X轴上为日期的直方图。将间隔设置为每分钟,最后在搜索框中添加一个过滤器 "hasException:true" 。一个很棒的图表,显示每分钟记录的异常数目:每分钟记录的异常数目接下来,显示每个 category 随时间记录的消息数量,限于前5个 category :转到Kibana的&可视化 (Visualize)&页面,并创建一个新的&线型图 (Line chart)&。再次选择Y轴作为计数,X轴上为日期的直方图,选择dateTime作为字段,间隔为每分钟。现在添加一个 sub-bucket 并选择 "split lines" 。使用 "significant terms" 作为聚合,category 为字段,单位为5个。这将绘制类似于以下的图表:随着时间的推移尝试在搜索框中添加一些过滤器,并查看它对结果的影响。最后,我们添加另一个图表,我们将看到前五个出现最多的消息和前五个 categories 的消息。转到Kibana的&可视化 (Visualize)&页面,并创建一个新的&饼图 (Pie chart)&。像之前一样,选择Y轴的计数现在,将 "Terms" 作为聚合,将 "category" 作为字段,数量作为单位,限制前五个,画出图表。然后将 "Terms" 作为聚合来分割切片,"message.keyword" 作为字段,数量作为单位,限制前五个。一旦你有了这些设置,你会看到一个类似于这个图表:每个 category 中最常见的消息花时间观察下数据(百分比,message/category 显示在图表元素上)。例如,您将观察到由DeveloperExceptionPageMiddleware类记录的异常。结论Elasticsearch是一个强大的数据索引和查询平台。虽然它本身相当令人印象深刻,但与其他应用程序(如Kibana)相结合,可以很好地分析、报告和可视化数据。只要您开始使用,只是蜻蜓点水都能的到非凡的结果。对于 .Net 和 .Net Core,Elasticsearch 官方的 API 已经覆盖,因为它们支持 .Net Standard 1.3和更高版本(他们仍然在为1.1提供支持)。正如我们已经看到的,在 ASP.Net Core 项目中使用这个 API 是很方便的,我们可以轻松地将其 REST API 作为存储,以及在应用程序中作为日志提供程序。最后但并非不重要的一点,我希望您。尝试使用 Elasticsearch,同时思考Docker可以为您和您的团队做些什么。标签:&&&&&&&&&&&&&&&原文:http://2838
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!

我要回帖

更多关于 redis可视化工具使用 的文章

 

随机推荐