[翻译] ASP.NET Core 利用 Docker、ElasticSearch、Kibana 来记录日志

一步一步指导您使用 ElasticSearch, Kibana, ASP.NET Core 2.1 和 Docker 来记录日志

640?wx_fmt=png

在本教程中,我将向您展示如何启动和运行 ElasticSearch,Kibana 和 ASP.NET Core 2.1

在开始之前,让我们来看看 ElasticSearch,Kibana 和 Serilog 分别是什么。

什么是 ElasticSearch ?

简单来说,ElasticSearch 是一个开源数据库,非常适合索引日志和分析数据。

什么是 Kibana ?

Kibana 是开源的 ElasticSearch 的数据可视化用户界面。可以将 ElasticSearch 视为数据库,将Kibana 视为 Web 用户界面,您可以使用它在 ElasticSearch 中构建图表和查询数据。

什么是 Serilog ?

Serilog 是 ASP.NET Core 的一个插件,可以简化日志记录。Serilog 有各种可用的接收器,例如,有纯文本、SQL 和 ElasticSearch 接收器等等。

为什么 ElasticSearch 如此受欢迎?

除了几乎每个应用程序都需要日志记录这一事实之外,ElasticSearch 解决了许多问题并且做得非常好:

  • 它是免费和开源的
    免费。好吧,我承认是基本功能免费。如果您需要 Kibana 中的安全和警报功能,您可以购买 Kibana 的商业 X-pack 订阅,或者可以找一些开源的替代品。

  • RESTful API
    ElasticSearch 有一个 RESTful 的 API。查询结果以 JSON 格式返回,这意味着结果是非常易用的。通过 RESTful API 查询和插入数据意味着使用任何编程语言都可以轻松使用 ElasticSearch。

  • 易于查询
    ElasticSearch 有一个内置的基于 Apache Lucene 的全文搜索引擎。与其他数据库相比,Lucene易于查询。即使是非技术人员也可以编写常见查询。

  • 快 - 非常快
    查询大型 SQL 数据库很容易花费 10 或 20 秒。对于大型 ElasticSearch 数据库上的类似查询,在 10 毫秒内返回结果是很常见的。

  • 可扩展
    它很容易扩展。再加上它是开源的, 这意味着您可以很容易控制您的钱包。

  • 易于安装
    只需启动包含 ElasticSearch 和 Kibana 容器的 docker compose 文件,您就可以开始记录和搜索了。

为什么我需要 ElasticSearch 和 Kibana ?

如果您曾经构建过应用程序,那么你一定记录过日志。我们经常去记录错误,但这些错误日志存储在服务器某处的文件文件里,经常会无法被访问。ElasticSearch 使任何类型的日志记录变得简单,易于访问和搜索。

ElasticSearch 令人难以置信的速度和简单的查询语言加上 Kibana 的图形界面,构成了强大的组合。如果您还没有使用 ElasticSearch 进行日志记录,我强烈建议您开始使用它。

信息足够了,让我们开始 Coding 。

我将使用 Visual Studio Code,一个开源的跨平台代码编辑器。出于本教程的目的,我将使用 Mac OSX,但您也可以使用 Ubuntu 或 Windows 10。

准备条件

要继续下面的步骤,请确保安装了这些:

  • Docker

  • Visual Studio Code

  • .NET Core SDK 2.1.300 或更高版本 ( 下载 )

创建项目文件夹

mkdir elastic-kibana
cd elastic-kibana

使用 .NET Core 命令行创建 MVC 项目

dotnet new mvc -n elastic-kibana -o src

在 Visual Studio Code 中打开项目

cd elastic-kibana
code .

创建 docker compose 文件

接下来,创建一个 docker compose 文件。此文件将一并启动 ElasticSearch 和 Kibana 容器,无需为每个容器运行单独的docker run命令。

mkdir docker
cd docker

创建一个名为 docker-compose.yml 的文件:

version'3.1'

services:

elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: elasticsearch
ports:
- "9200:9200"
volumes:
- elasticsearch-data:/usr/share/elasticsearch/data
networks:
- docker-network

kibana:
image: docker.elastic.co/kibana/kibana:6.2.4
container_name: kibana
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- docker-network

networks:
docker-network:
driver: bridge

volumes:
elasticsearch-data:

接下来,运行 docker compose 命令来启动容器。

docker-compose up -d

第一次运行 docker-compose up 命令时,它将从 docker 仓库下载 ElasticSearch 和 Kibana 所需的镜像,因此它将花费几分钟的时间。

运行 docker-compose up 命令后,请检查 ElasticSearch 和 Kibana 是否已经启动。

ElasticSearch

打开 http://localhost:9200 确认 ElasticSearch 已经启动。

640?wx_fmt=png

Kibana

打开 http://localhost:5601 确认 Kibana 已经启动。

640?wx_fmt=png


加 Nuget 包到项目

我们将添加以下 Serilog 的包到项目。

Serilog
Serilog.Sinks.ElasticSearch
Serilog.Extensions.Logging

cd ..
cd elastic-kibana
dotnet add package Serilog
dotnet add package Serilog.Sinks.ElasticSearch
dotnet add package Serilog.Extensions.Logging
dotnet restore

添加一些配置信息到 appsettings.json

添加默认的日志设置以及 ElasticSearch 的 url 到 appsettings.json 文件

{
"Logging": {
"LogLevel": {
"Default""Information",
"System""Information",
"Microsoft""Information"
}
},
"ElasticConfiguration": {
"Uri""http://localhost:9200/"
}
}

在 Startup.cs 中配置日志功能

下一步,在 Startup.cs 中配置日志功能

添加这些 using 语句:

using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Sinks.Elasticsearch;

然后,配置 Startup 的构造函数以从 appsettings.json 加载 ElasticSearch 的 URL,并配置 ElasticSearch 的接收器。

public Startup(IConfiguration configuration, IHostingEnvironment hostingEnvironment)
{
var builder = new ConfigurationBuilder()
.SetBasePath(hostingEnvironment.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", reloadOnChange: true, optional: true)
.AddEnvironmentVariables();

Configuration = builder.Build();

var elasticUri = Configuration["ElasticConfiguration:Uri"];

Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(elasticUri))
{
AutoRegisterTemplate = true,
})
.CreateLogger();
}

最后,在 Configure 方法中将 Serilog 添加到日志工厂。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{


loggerFactory.AddSerilog();


}

开始记录日志到 ElasticSearch

现在,通过在 Visual Studio Code 中点击 F5 或者命令行中执行 dotnet run 来运行 MVC 应用程序。

640?wx_fmt=png

启动 Kibana

由于我们在 Startup 类中配置了日志记录并将最小日志级别设置为 Information,因此运行该应用程序会将一些事件记录到 ElasticSearch 。

在 http://localhost:5601 打开 Kibana,以便我们可以查看日志。

加载 Kibana 后,您将看到默认页面。

640?wx_fmt=png

在 Kibana 中创建索引模式来显示数据

Kibana 现在还不会显示任何日志。您必须先指定索引才能查看记录的数据。为此,请单击导航中的 Management 链接,然后将列在页面底部的 logstash 索引名称复制到文本框中,如下所示,然后单击下一步按钮。或者,您可以使用*号通配符,例如 logstash-*

640?wx_fmt=png

然后,通过选择 @timestamp 指定时间过滤器字段名称,然后单击 Create index pattern按钮。

640?wx_fmt=png

您现在可以通过单击导航中的 Discover 链接来查看日志。

640?wx_fmt=png

在 MVC Controller 中记录自定义消息

由于我们指定要记录日志级别为 Information 或更高级别的消息,因此默认情况下会记录大量信息消息。但是如果我们想记录自己的消息呢?值得庆幸的是,这很容易做到。接下来我将在 HomeController 中记录一条消息。

添加 using 语句:

using Microsoft.Extensions.Logging;

然后,使用构造函数注入的方式来注入 ILogger 的实例。

ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}

最后,在 Index Action 中记录一条消息。

public IActionResult Index()
{
_logger.LogInformation($"oh hai there! : {DateTime.UtcNow}");

return View();
}

在 Kibana 中搜索

现在我们已经记录了一条消息,只需打开 Kibana 并搜索日志消息的文本即可。

640?wx_fmt=png

您还可以将某一条日志在单独的窗口中打开,以查看各个字段记录的信息。

640?wx_fmt=png

我将展示一些基本的搜索示例,来演示在 Kibana 中搜索的容易程度以及 ElasticSearch 的强大功能:

message:"oh hai there"
level:"Information"
fields.ActionName:"elastic_kibana.Controllers.HomeController.Index"
(message:"oh hai there" AND fields.ActionName:"elastic_kibana.Controllers.HomeController.Index")

记录错误日志到 ElasticSearch

一个典型的需求就是记录错误消息。使用 Serilog 这将变得非常简单,如下所示。

try
{
throw new Exception("oops. i haz cause error in UR codez.");
}
catch (Exception ex)
{
_logger.LogError(ex, "ur code iz buggy.");
}

在 Kibana 中搜索错误日志

在 Kibana 中找到错误日志非常简单,使用如下的搜索条件就可以找到所有的错误日志了。

level"Error"

640?wx_fmt=png

我们来看看使用 Serilog 和 ElasticSearch 默认记录的详细信息。

640?wx_fmt=png

它看起来还不错,但您会注意到异常细节被记录为一个大大的字符串。在此字符串中搜索信息仍会返回结果,但如果根据特定字段记录信息,我们可以执行更强大和特定的搜索。值得庆幸的是,有一个名为 Serilog.Exceptions 的插件可以帮助我们。

安装 Serilog.Exceptions Nuget 包

安装 Serilog.Exceptions Nuget 包:

dotnet add package Serilog.Exceptions
dotnet restore

接下来,在 Startup.cs 文件中使用如下 using 语句

using Serilog.Exceptions;

然后,使用 Serilog.Exceptions 来丰富一下 Logger

public Startup(IConfiguration configuration, IHostingEnvironment hostingEnvironment)
{


Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithExceptionDetails()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(elasticUri))
{
AutoRegisterTemplate = true,
})
.CreateLogger();
}

最后,刷新一下,记录一个新的错误,并在 Kibana 中搜索到它,查看更结构化的错误日志记录。

640?wx_fmt=png

降低日志级别

您可能会发现 Information 级别日志有点过于冗长,不符合您的口味。默认情况下,ASP.NET Core 将记录 Kestrel 托管相关的日志事件。这可能会非常嘈杂。排除掉它们的一种简单方法是通过修改 appsettings 文件,将 Microsoft 日志级别设置为 Warning 。
或者, 您可以通过将 Default 和 System 的最小日志级别设置为 Error 来进一步限制日志记录, 如下所示。

  "Logging": {
"LogLevel": {
"Default""Error",
"System""Error",
"Microsoft""Warning"
}
}

尾声

传统的方法,日志记录需要大量的前期工作才能启动和运行。因此,日志记录通常会被完全遗漏,或者写入到难以访问的服务器上的某些模糊的文本文件里。

ElasticSearch 和 Kibana 改变了这一切。而 Docker 已经使 ElasticSearch 和 Kibana 的启动和运行变得毫不费力。ElasticSearch 和 Kibana 提供的强大功能以及非常高的性能,再加上它是开源的,这真的令人印象非常深刻。

即使没有像 Serilog 这样的插件,与传统 ASP.NET 相比,ASP.NET Core 中的日志记录也变得更加容易,因此, 在创建可扩展的日志记录框架方面, 我对 .NET Core 团队表示赞赏。Serilog 简单地构建在此之上,并且扩展了功能,以使 .NET Core 开发人员的日志记录变得更简单。

通过组合 Docker,ElasticSearch,Kibana,ASP.NET Core 和 Serilog ,您获得了前所未有的便利性和功能,再也没有理由不再将日志记录整合到应用程序中了。

下载源代码

下载源代码 : https://github.com/thecarlo/elastic-kibana-netcore-serilog

资源

Download .NET Core 2.1 SDK
ElasticSeach
Kibana
Serilog
Serilog.Sinks.ElasticSearch Nuget Package


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】WQS二分详解及常见理解误区解释

文章目录应用分析算法分析WQS二分精髓的两点细节&#xff08;博客重点&#xff01;&#xff09;真题分析[国家集训队]Tree Ⅰ忘情星际广播网上很多博客写得模模糊糊的&#xff0c;对我这个新手可是一点都不友好。 昨天一天都在研究这个东西&#xff0c;分享一下自己的拙见。 百…

ASP.NET Core中HTTP管道和中间件的二三事

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;中间件是什么&#xff1f;在.NET Core中的工作原理又是怎样的呢&#xff1f;配置ASP.NET Core请求(Request)处理管道在本视频中&#xff0c;我们将讨论使用中间件组件为asp.net core 应用程序配置请求处理管道。作为…

.Net Core Razor 预编译,动态编译,混合编译

预编译预编译是ASP .Net Core的默认方式。在发布时&#xff0c;默认会将系统中的所有Razor视图进行预编译。编译好的视图DLL统一命名为 xxx.PrecompiledViews.dll 或者 xxx.Views.dll动态编译将项目整个配置成动态编译很简单&#xff0c;添加一个配置项目MvcRazorCompileOnPubl…

一张图来看看.NETCore和前后端技术的演进之路

一张图2019年3月10日&#xff0c;在长沙.NET 技术社区组织的技术沙龙《.NET Core和前后端分离那些事儿》上&#xff0c;我们曾经试图通过一系列抽丝剥茧的过程来引导大家在这条基于.NET Core的前后端分离有关的技术路线上持续发散&#xff0c;由于各种原因未能成功&#xff0c;…

【学习笔记】我命由天不由我之随机化庇佑 —— 爬山法 和 模拟退火法

以下均假设最优解是在最低点。 爬山法 爬山算法是一种局部择优的方法&#xff0c;采用启发式方法&#xff0c;是对深度优先搜索的一种改进&#xff0c;它利用反馈信息帮助生成解的决策。 直白地讲&#xff0c;就是当目前无法直接到达最优解&#xff0c;但是可以判断两个解哪…

Strange Memory Gym - 102832F

Strange Memory Gym - 102832F 题意&#xff1a; 有一颗n个节点的树&#xff0c;求下面公式的值&#xff1a; 题解&#xff1a; a ⊕ b c 可以推出a ⊕ c b 那么ai⊕ajalca(i,j)a_{lca(i,j)}alca(i,j)​,可以得到&#xff1a;ai⊕alca(i,j)a_{lca(i,j)}alca(i,j)​aj,ai就…

.net core 使用RSA获取私钥证书并签名

以前我们使用RSA加密主要是使用RSACryptoServiceProvider这个类&#xff0c;在.NET Core中也有这个类&#xff0c;但是这个类并不支持跨平台&#xff0c;所以如果你是用这个类来进行加/解密在windows上运行是完全没有错误的&#xff0c;但是只要你一放到Linux下就会出现异常。查…

CDN流量调度问题(2021CCPC华为云挑战赛)

CDN流量调度问题 题意&#xff1a; 有n个线路&#xff0c;每个线路的任务量为a[i],初始状态下&#xff0c;每个线路起初只有一个节点&#xff0c;每个线路完成任务所需时间为 现在你要给每个线路增加节点&#xff0c;所有增加的节点总数不超过m&#xff0c;第i个线路增加节点…

.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容

.NET Core 3.0 Preview 3已经推出&#xff0c;它包含了一系列关于ASP.NET Core的新的更新。下面是该预览版的更新列表&#xff1a;Razor组件改进:单项目模板 新的Razer扩展Endpoint路由集成预呈现Razor类库中的Razor组件改进事件处理 Forms & validation运行时编译Worker服…

世界五星级大厨经典菜品集

本blog只是记录C学习以来掉过的一些坑&#xff0c;写下来防止自己下一次再犯&#xff0c;顺便分享 持续更新&#xff0c;到死为止菜品特套1&#xff1a;vector.size() ~ 的使用菜品特套2&#xff1a;if-else的缩进菜品特套3&#xff1a;int范围边界的1ll使用菜品特套4&#xff…

ASP.NET Core 使用 Google 验证码(Google reCAPTCHA)

关心最多的问题&#xff0c;不FQ能不能用&#xff0c;答案是能。Google官方提供额外的域名来提供服务&#xff0c;国内可以正常使用。一. 前言验证码在我们实际的生活场景中非常常见&#xff0c;可以防止恶意破解密码、刷票、论坛灌水、刷注册等等。现在的网站基本都有使用验证…

P4173 残缺的字符串

P4173 残缺的字符串 题意&#xff1a; 有A&#xff0c;B两个串&#xff0c;每个串都有通配符&#xff0c;问A为模板串&#xff0c;对于 B 的每一个位置 i&#xff0c;从这个位置开始连续 m 个字符形成的子串是否可能与 A 串完全匹配&#xff1f; 题解&#xff1a; 我们定义…

FFT/NTT卷积神级副本

干货满满的良心博客传送至只有小怪的村庄——请开始你的逆天之路A&#xff1a;P1919B&#xff1a;P4157刷怪升级——转战玄灵大陆C&#xff1a;P6300D&#xff1a;P3763E&#xff1a;P3321F&#xff1a;P5641G&#xff1a;P4986H&#xff1a;P4721——获得知识药剂一瓶——分治…

程会玩 | 在.NET Core里操作Git

点击上方蓝字关注“汪宇杰博客”Git是很多程序员的首选源代码版本控制工具&#xff0c;我最近也从TFVC切换到了Git&#xff0c;受益匪浅。今天我就来带大家看看如何在.NET Core里操作Git。为啥要这么做首先&#xff0c;这件事情的意义&#xff0c;并不是闲的蛋疼。我们确实有很…

一个实时收集MySql变更记录的组件CanalSharp.AspNetCore

一、关于CanalSharpCanalSharp 是阿里巴巴开源项目 Canal 的 .NET 客户端。为 .NET 开发者提供一个更友好的使用 Canal 的方式。Canal 是mysql数据库binlog的增量订阅&消费组件。CanalSharp 是 Canal 的 .NET 客户端&#xff0c;它与 Canal 是采用的Socket来进行通信的&…

[Abp vNext 源码分析] - 1. 框架启动流程分析

一、简要说明本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程&#xff0c;让大家了解整个 Abp vNext 框架是如何运作的。总的来说 &#xff0c;Abp vNext 比起 ABP 框架更加精简。因为在 vNext 版本当中&#xff0c;原来归属于 Abp 库的许多内置的基本组件 (组织…

使用 MSIX 打包 DotNetCore 3.0 客户端程序

如何你希望你的 WPF 程序能够以 Windows 的保护机制保护起来&#xff0c;不被轻易反编译的话&#xff0c;那么这篇文章应该能帮到你。介绍MSIX 是微软于去年的 Windows 开发者日峰会 上推出的全新应用打包解决方案。其目的是取代旧式的软件打包方式&#xff0c;可用于 Win32、W…

使用 C# 和 Blazor 进行全栈开发

Blazor 是将 C# 引入浏览器的 Microsoft 试验框架&#xff0c;正好可以填补欠缺的 C# 一环。如今&#xff0c;C# 程序员可以编写桌面、服务器端 Web、云、电话、平板电脑、手表、电视和 IoT 应用程序。Blazor 填补了欠缺的一环&#xff0c;C# 开发人员现在可以直接在用户浏览器…

AWS vs K8s 是新的 Windows vs Linux

作者&#xff1a;Ian Miell是开源程序员、演讲师、作家和博客写手以前……如果你与我一样&#xff0c;年过四十&#xff0c;又在IT行业工作&#xff0c;恐怕还记得每个人使用Windows&#xff0c;一小群但越来越多的人在业余时间埋头编译Linux的年代。Windows用户见此情形会困惑…

Asp.Net Core中的静态文件-12

目录本文出自《从零开始学 ASP.NET CORE MVC》目录 推荐文章&#xff1a;配置 ASP.NET Core 请求(Request)处理管道Asp.Net Core 中的静态文件在这个视频中我们将讨论如何使 ASP.NET Core 应用程序&#xff0c;支持静态文件&#xff0c;如 HTML&#xff0c;图像&#xff0c;CSS…