• ABP 使用ElasticSearch、Kibana、Docker 进行日志收集


    ABP 使用ElasticSearchKibanaDocker 进行日志收集#

    后续会根据公司使用的技术,进行技术整理分享,都是干货哦别忘了关注我!!!

    最近领导想要我把项目日志进行一个统一收集,因为现在环境有什么报错信息都是看Logs文件夹的日志数据,如果只有一个项目那到无所谓,但是我们现在的服务进行了模块拆分,所以看日志需要一个一个的找不方便,之前我有接触过Seq、ElasticSearch进行日志收集统一查看。

    技术点#

    • ElasticSearch

    ElasticSearch 是一个非常适合索引日志和分析数据的开源数据库。

    • Kibana

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

    • Serilog

    Serilog 是一个用于 ASP.NET Core 的插件,它使日志记录变得容易。Serilog 有多种可用的接收器 - 例如,您可以获得纯文本、SQL 和 ElasticSearch 接收器等等。

    为什么用ElasticSearch(当然后面也会介绍Seq)#

    • 它是免费和开源

    基本功能是免费的,大部分都是免费的。如果您需要 Kibana 中的安全和警报功能,您可以购买 Kibana 的商业 X-pack 订阅,也可以安装一些开源替代品。

    • RESTful API

    查询结果以 JSON 格式返回,这意味着结果易于使用。通过 RESTful API 查询和插入数据意味着可以轻松使用任何编程语言来处理 ElasticSearch。

    • 易于查询

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

    • 速度很快 - 非常快

    查询大型 SQL 数据库可能需要 10 或 20 秒。大型 ElasticSearch 数据库上的类似查询通常会在 10 毫秒内返回结果。

    • 它是可扩展

    它很容易扩展。再加上它是开源的,这意味着它在钱包上也很容易。

    • 易于设置

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

    Docker搭建Elasticsearch 和 Kibana环境#

    这里我们使用了docker-compose所以我们需要安装docker-compose然后创建一个 docker-compose.yml 文件。

    mkdir -p home/docker/docker-compose
    cd home/docker/docker-compose
    

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

    vi docker-compose.yml
    

    docker-compose.yml文件内容

    • 设置es内存,java程序一般很吃内存,根据服务器配置进行调优- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    • kibana汉化(7.0以上版本),根据个人情况决定- output.i18n.locale="zh-CN"
    version: '3.1'
    services:
      elasticsearch:
       container_name: elasticsearch
       hostname: elasticsearch
       image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
       restart: always
       ports:
        - 9200:9200
        - 9300:9300
       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
      kibana:
       container_name: kibana
       hostname: kibana
       image: docker.elastic.co/kibana/kibana:7.9.2
       restart: always
       ports:
        - 5601:5601
       depends_on:
        - elasticsearch
       environment:
        - ELASTICSEARCH_URL=http://localhost:9200
    volumes:
      elasticsearch-data:
    
    

    运行 docker-compose.yml 文件#

    容器启动之后需要等待一会,因为初始化需要一段时间

    # 构建启动容器  -d 后台运行
    docker-compose up -d
    
    # 停止up 命令所启动的容器,并移除网络
    docker-compose down
    

    验证环境#

    • 验证 Elasticsearch 是否已启动并正在运行,我们可以访问http://localhost:9200(就是我们刚才开放Elasticsearch的9200端口)

    • 验证 Kibana 是否已启动并正在运行,我们可以访问http://localhost:5601(就是我们刚才开放Kibana的5601端口)

    使用Abp配合Serilog 记录日志到 Elasticsearch#

    • Serilog 包添加到项目中

      • Serilog.AspNetCore
      • Serilog.Enrichers.Environment
      • Serilog.Sinks.Debug
      • Serilog.Sinks.ElasticSearch
      • Serilog.Exceptions
    • appsettings.json 中添加 Serilog 日志和Elasticsearch地址

    {
      // Serilog 日志配置
      "Serilog": {
        "MinimumLevel": {
          "Default": "Information",
          "Override": {
            "Microsoft": "Information",
            "System": "Warning"
          }
        }
      },
      // Elasticsearch地址
      "ElasticConfiguration": {
        "Uri": "http://localhost:9200"
      },
      "AllowedHosts": "*"
    }
    

    在 Program.cs 中配置日志记录#

    接下来,通过添加以下 using 语句在 Program.cs 中配置日志记录:

    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Hosting;
    using Serilog;
    using Serilog.Sinks.Elasticsearch;
    using System;
    using System.Reflection;
    using Serilog.Exceptions;
    

    接下来,设置 main 方法。我们要做的是在创建主机之前设置日志记录。这样,如果主机无法启动,我们可以记录任何错误。

    public static void Main(string[] args)
    {
    	// 配置日志信息
    	ConfigureLogging();
    
    	// 然后创建主机,这样如果主机出现故障,我们就可以记录错误 
    	CreateHost(args);
    }
    

    然后,在 program.cs 中添加 ConfigureLogging 和 ElasticsearchSinkOptions 方法

    private static void ConfigureLogging()
    {
    	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()
                    .Enrich.WithExceptionDetails()
    		.Enrich.WithMachineName()
    		.WriteTo.Debug()
    		.WriteTo.Console()
    		.WriteTo.Elasticsearch(ConfigureElasticSink(configuration, environment))
    		.Enrich.WithProperty("Environment", environment)
    		.ReadFrom.Configuration(configuration)
    		.CreateLogger();
    }
    
    private static ElasticsearchSinkOptions ConfigureElasticSink(IConfigurationRoot configuration, string environment)
    {
    	return new ElasticsearchSinkOptions(new Uri(configuration["ElasticConfiguration:Uri"]))
    	{
                    // 自动创建模块
    		AutoRegisterTemplate = true,
                    // 创建索引(如果不设置默认就是logstash-2022.03.06这种时间格式的)
    		IndexFormat = $"{Assembly.GetExecutingAssembly().GetName().Name.ToLower().Replace(".", "-")}-{environment?.ToLower().Replace(".", "-")}"
    	};
    }
    

    最后,添加 CreateHost 和 CreateHostBuilder 方法。请注意 CreateHostBuilder 周围的 try/catch 块。

    private static void CreateHost(string[] args)
    {
    	try
    	{
    		CreateHostBuilder(args).Build().Run();
    	}
    	catch (System.Exception ex)
    	{
    		Log.Fatal($"Failed to start {Assembly.GetExecutingAssembly().GetName().Name}", ex);
    		throw;
    	}
    }
    
    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();
    

    然后运行一次你的程序,让它自动创建好索引信息,后面我们就只需要配置了

    kibana配置信息#

    • 点击进入默认管理空间

    • 管理空间配置

    Kibana 目前还不会显示任何日志。您必须先指定索引,然后才能查看记录的数据。
    这里就可以看到logstash就是我们创建的索引(我之前没有设置索引所以就默认是logstash-2022.03.06)

    输入你的索引模式。它将显示刚刚创建的索引模式。您可以键入整个索引,或使用通配符。

    在下一页上,选择 @timestamp 字段作为时间过滤器字段名称,然后单击创建索引模式按钮。

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

    我们程序中打出来的日志就会被收集到这里,这里我就不演示怎么写打日志的代码了哈。(刚才上厕所尿劈叉了)

    配置日志过期策略#

    因为我们的日志信息一般都不需要保留很长的时间。(一般保存3天左右就够了,过期的日志将自动清除,这样也能减少我们日志内存的消耗)

    • 记得关掉热阶段的滚动更新
    • 开启删除阶段,设置过期时间,快照可以不用

    关联索引策略模式

    选择我们刚才设置的策略模块,进行关联。(这样我们的日志就会自动释放啦)

  • 相关阅读:
    VM501开发套件开发版单振弦式传感器采集模块岩土工程监测
    Kotlin之控制语句和表达式
    Python使用SQLAlchemy操作sqlite
    希望所有计算机学生都知道这些宝藏网站
    VS Code使用node.js编译,代码自动补全方法
    Android SensorManager学习
    公众号突破公司注册数量限制
    国际结算习题(带答案)
    mac安装nvm
    TRITC-透明质酸,TRITC-hyaluronic acid,四甲基罗丹明标记透明质酸
  • 原文地址:https://www.cnblogs.com/chenxi001/p/15974197.html