.NetCore使用Docker安装ElasticSearch、Kibana、Serilog 记录日志
在本文中,我将向您展示.NetCore使用Docker安装ElasticSearch、Kibana、Serilog 记录日志。
在深入研究实施之前,让我们了解基础知识。
你可以在这里找到源代码
什么是ElasticSearch?
Elasticsearch 是一个分布式开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 建立在 Apache Lucene 之上,由 Elasticsearch NV(现称为 Elastic)于 2010 年首次发布,来源于 此处。
什么是 Kibana?
Kibana 是一个位于 ElasticSearch 之上的 UI 应用程序。为 ElasticSearch 中的数据索引提供搜索和可视化功能。
什么是 Serilog?
为什么使用 ElasticSearch 和 Kibana 进行日志记录?
传统上,我们经常使用文件来创建日志文件。它有几个缺点
- 访问服务器上的日志文件是一项乏味的工作。
- 在日志文件中搜索错误非常麻烦且耗时。
使用 ElasticSearch 可以纠正这些缺点。它使用简单的查询语言和 Kibana 界面使日志记录易于访问和搜索。
前提条件
要继续前进,请确保安装了以下内容
- Visual studio/ Visual studio code
- Docker Desktop
- .net core sdk 3.1
项目创建和 Nuget 包
我们首先创建一个 ASP.NET Core Web API 应用程序,并将项目名称指定为“ElasticKibanaLoggingVerify”。
创建项目后,请确保安装了 nuget 包。
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Enrichers.Environment
dotnet add package Serilog.Sinks.Elasticsearch
ElasticSearch 和 Kibana 的 Docker Compose
在开始实施之前,让我们启动 ElasticSearch 和 Kibana 的 docker 容器。
Docker 支持单节点和多节点 ElasticSearch。建议单节点进行开发和测试;而多节点用于预生产和生产环境。
创建一个新文件夹作为 docker 并创建一个新文件作为 docker-compose.yml。
version: '3.4'
elasticsearch:
container_name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.1
ports:
- 9200:9200
volumes:
- elasticsearch-data:/usr/share/elasticsearch/data
environment:
- xpack.monitoring.enabled=true
- xpack.watcher.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.type=single-node
networks:
- elastic
kibana:
container_name: kibana
image: docker.elastic.co/kibana/kibana:7.9.1
ports:
- 5601:5601
depends_on:
- elasticsearch
environment:
- ELASTICSEARCH_URL=http://localhost:9200
networks:
- elastic
networks:
elastic:
driver: bridge
volumes:
elasticsearch-data:
还有一个简单的方法来创建既ElasticSearch和Kibana使用单个容器的命令在这里。
验证 ElasticSearch 和 Kibana 是否已启动并正在运行
导航到 http://localhost:9200 以验证 ElasticSearch
导航到 http://localhost:5601 以验证 Kibana
删除用于日志记录的开箱即用配置
正如上一篇关于 Serilog 的文章所讨论的,appsettings.json 中的开箱即用的日志配置不是必需的。开箱即用的 appsettings.json 只需要以下配置。
{
"AllowedHosts": "*"
}
"ElasticConfiguration": {
"Uri": "http://localhost:9200"
},
"AllowedHosts": "*"
下一步是在 program.cs 中配置日志记录。
using System;
using System.Reflection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Sinks.Elasticsearch;
namespace ElasticKibanaLoggingVerify
{
public class Program
{
public static void Main(string[] args)
{
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile(
$"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json",
optional: true)
.Build();
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(configuration["ElasticConfiguration:Uri"]))
{
AutoRegisterTemplate = true,
IndexFormat = $"{Assembly.GetExecutingAssembly().GetName().Name.ToLower()}-{DateTime.UtcNow:yyyy-MM}"
})
.Enrich.WithProperty("Environment", environment)
.ReadFrom.Configuration(configuration)
.CreateLogger();
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}).ConfigureAppConfiguration(configuration =>
{ configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
configuration.AddJsonFile(
$"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json",optional: true);
})
.UseSerilog();
}
}
在上一篇关于 Serilog 的文章中,我们已经看到了丰富和 SinkOptions 的重要性。
可以在代码中注册 ElasticSearch sink 如下
WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(configuration["ElasticConfiguration:Uri"]))
{
AutoRegisterTemplate = true,
IndexFormat = $"{Assembly.GetExecutingAssembly().GetName().Name.ToLower()}-{DateTime.UtcNow:yyyy-MM}"
})
创建一个控制器来验证行为
您可以创建一个控制器来验证 Kibana 中的日志记录详细信息。
Route("api/[controller]")]
public class ElasticSearchController : Controller
{
private readonly ILogger<ElasticSearchController> _logger;
public ElasticSearchController(ILogger<ElasticSearchController> logger)
{
_logger = logger;
}
// GET: api/values
[HttpGet]
public int GetRandomvalue()
{
var random = new Random();
var randomValue=random.Next(0, 100);
_logger.LogInformation($"Random Value is {randomValue}");
return randomValue;
}
}
_logger.LogInformation($"Random Value is {randomValue}");
开始将事件记录到 ElasticSearch 并配置 Kibana
现在,通过单击 F5 并导航到https://localhost:5001/api/ElasticSearch来运行 Web API 应用程序
现在,让我们在 Kibana 中配置一个索引
message: "59"
将错误记录到 ElasticSearch
让我们在 ElasticSearch Controller 中添加一个新的 HTTP GET 方法
[HttpGet("{id}")]
public string ThrowErrorMessage(int id)
{
try
{
if (id <= 0)
throw new Exception($"id cannot be less than or equal to o. value passed is {id}");
return id.ToString();
}
catch (Exception ex)
{
_logger.LogError(ex, ex.Message);
}
return string.Empty;
}
上面的代码非常简单明了,一目了然。让我们通过传递 id 等于 0 来测试 ThrowErrorMessage 方法。
level:"error"
message: "value passed" and level:"error"
结论
早些时候,设置日志是一项相当乏味的工作,此后,从服务器获取log文件并识别/搜索错误是另一个痛苦。
有了 Docker,设置环境就变得轻而易举了,尤其是在微服务架构的情况下,创建 ElasticSearch 索引变得更加容易,并且可以使用 Kibana 将已记录的数据可视化。
当您在具有多节点的 Kubernetes/Azure Kubernetes Service Orchestrator 中执行相同的设置时,日志记录功能会更加强大。
开发人员/架构师真的没有理由不使用 ElasticSearch、Kibana 和 Docker 来合并日志记录。
我希望你喜欢这篇文章。如果您觉得这篇文章很有趣,请点赞并分享。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!