原文: Logging with ElasticSearch, Kibana, ASP.NET Core and Dockerjavascript
一步一步指导您使用 ElasticSearch, Kibana, ASP.NET Core 2.1 和 Docker 来记录日志php
在本教程中,我将向您展现如何启动和运行 ElasticSearch,Kibana 和 ASP.NET Core 2.1css
在开始以前,让咱们来看看 ElasticSearch,Kibana 和 Serilog 分别是什么。html
简单来讲,ElasticSearch 是一个开源数据库,很是适合索引日志和分析数据。java
Kibana 是开源的 ElasticSearch 的数据可视化用户界面。能够将 ElasticSearch 视为数据库,将Kibana 视为 Web 用户界面,您可使用它在 ElasticSearch 中构建图表和查询数据。nginx
Serilog 是 ASP.NET Core 的一个插件,能够简化日志记录。Serilog 有各类可用的接收器,例如,有纯文本、SQL 和 ElasticSearch 接收器等等。git
除了几乎每一个应用程序都须要日志记录这一事实以外,ElasticSearch 解决了许多问题而且作得很是好:github
若是您曾经构建过应用程序,那么你必定记录过日志。咱们常常去记录错误,但这些错误日志存储在服务器某处的文件文件里,常常会没法被访问。ElasticSearch 使任何类型的日志记录变得简单,易于访问和搜索。docker
ElasticSearch 使人难以置信的速度和简单的查询语言加上 Kibana 的图形界面,构成了强大的组合。若是您尚未使用 ElasticSearch 进行日志记录,我强烈建议您开始使用它。数据库
我将使用 Visual Studio Code,一个开源的跨平台代码编辑器。出于本教程的目的,我将使用 Mac OSX,但您也可使用 Ubuntu 或 Windows 10。
要继续下面的步骤,请确保安装了这些:
mkdir elastic-kibana cd elastic-kibana
dotnet new mvc -n elastic-kibana -o src
cd elastic-kibana code .
接下来,建立一个 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 是否已经启动。
打开 http://localhost:9200 确认 ElasticSearch 已经启动。
打开 http://localhost:5601 确认 Kibana 已经启动。
咱们将添加如下 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
添加默认的日志设置以及 ElasticSearch 的 url 到 appsettings.json 文件
{
"Logging": { "LogLevel": { "Default": "Information", "System": "Information", "Microsoft": "Information" } }, "ElasticConfiguration": { "Uri": "http://localhost:9200/" } }
下一步,在 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(); /// ... }
如今,经过在 Visual Studio Code 中点击 F5 或者命令行中执行 dotnet run
来运行 MVC 应用程序。
因为咱们在 Startup 类中配置了日志记录并将最小日志级别设置为 Information
,所以运行该应用程序会将一些事件记录到 ElasticSearch 。
在 http://localhost:5601 打开 Kibana,以便咱们能够查看日志。
加载 Kibana 后,您将看到默认页面。
Kibana 如今还不会显示任何日志。您必须先指定索引才能查看记录的数据。为此,请单击导航中的 Management
连接,而后将列在页面底部的 logstash 索引名称复制到文本框中,以下所示,而后单击下一步按钮。或者,您可使用*号通配符,例如 logstash-*
而后,经过选择 @timestamp
指定时间过滤器字段名称,而后单击 Create index pattern
按钮。
您如今能够经过单击导航中的 Discover
连接来查看日志。
因为咱们指定要记录日志级别为 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 中搜索的容易程度以及 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")
一个典型的需求就是记录错误消息。使用 Serilog 这将变得很是简单,以下所示。
try { throw new Exception("oops. i haz cause error in UR codez."); } catch (Exception ex) { _logger.LogError(ex, "ur code iz buggy."); }
在 Kibana 中找到错误日志很是简单,使用以下的搜索条件就能够找到全部的错误日志了。
level: "Error"
咱们来看看使用 Serilog 和 ElasticSearch 默认记录的详细信息。
它看起来还不错,但您会注意到异常细节被记录为一个大大的字符串。在此字符串中搜索信息仍会返回结果,但若是根据特定字段记录信息,咱们能够执行更强大和特定的搜索。值得庆幸的是,有一个名为 Serilog.Exceptions 的插件能够帮助咱们。
安装 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 中搜索到它,查看更结构化的错误日志记录。
您可能会发现 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