.NetCore使用Docker安装ElasticSearch、Kibana、Serilog 记录日志

作者 : 慕源网 本文共5231个字,预计阅读时间需要14分钟 发布时间: 2021-11-24 共452人阅读

在本文中,我将向您展示.NetCore使用Docker安装ElasticSearch、Kibana、Serilog 记录日志。

在深入研究实施之前,让我们了解基础知识。

你可以在这里找到源代码

什么是ElasticSearch?

Elasticsearch 是一个分布式开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 建立在 Apache Lucene 之上,由 Elasticsearch NV(现称为 Elastic)于 2010 年首次发布,来源于 此处

什么是 Kibana?

Kibana 是一个位于 ElasticSearch 之上的 UI 应用程序。为 ElasticSearch 中的数据索引提供搜索和可视化功能。

什么是 Serilog?

我已经写了一篇关于 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 的最新版本是 v7.9.1。我强烈建议您查看此链接以确保您使用的是最新版本。

还有一个简单的方法来创建既ElasticSearch和Kibana使用单个容器的命令在这里

注意
我还没有尝试过上面的容器,在生产环境中不建议在单个容器中同时运行 ElasticSearch 和 Kibana。

验证 ElasticSearch 和 Kibana 是否已启动并正在运行

导航到 http://localhost:9200 以验证 ElasticSearch

导航到 http://localhost:5601 以验证 Kibana

删除用于日志记录的开箱即用配置

正如上一篇关于 Serilog 的文章所讨论的,appsettings.json 中的开箱即用的日志配置不是必需的。开箱即用的 appsettings.json 只需要以下配置。

{  
  "AllowedHosts": "*"  
}  
现在在 appsettings.json 中添加 ElasticSearch url。
"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;  
        }  
}  
上面的控制器是不言自明的,并生成 0 到 100 之间的随机值。此后,我使用记录随机值
_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 来合并日志记录。

我希望你喜欢这篇文章。如果您觉得这篇文章很有趣,请点赞并分享。


慕源网 » .NetCore使用Docker安装ElasticSearch、Kibana、Serilog 记录日志

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录