• <menu id="sssag"></menu>
  • <menu id="sssag"></menu>
  • Loading

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

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

    后續會根據公司使用的技術,進行技術整理分享,都是干貨哦別忘了關注我?。?!

    最近領導想要我把項目日志進行一個統一收集,因為現在環境有什么報錯信息都是看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 易于查詢。即使是非技術人員也可以編寫常見查詢。

    • 速度很快 - 非???/li>

    查詢大型 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天左右就夠了,過期的日志將自動清除,這樣也能減少我們日志內存的消耗)

    • 記得關掉熱階段的滾動更新
    • 開啟刪除階段,設置過期時間,快照可以不用

    關聯索引策略模式

    選擇我們剛才設置的策略模塊,進行關聯。(這樣我們的日志就會自動釋放啦)

    posted @ 2022-03-07 09:40  是你晨曦哥呀  閱讀(1836)  評論(15編輯  收藏  舉報
    国产在线码观看超清无码视频,人妻精品动漫H无码,十大看黄台高清视频,国产在线无码视频一区二区三区,国产男女乱婬真视频免费,免费看女人的隐私超爽,狠狠色狠狠色综合久久蜜芽