天天看點

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 易于查詢。即使是非技術人員也可以編寫常見查詢。

  • 速度很快 - 非常快

查詢大型 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端口)
ABP 使用ElasticSearch、Kibana、Docker 進行日志收集
  • 驗證 Kibana 是否已啟動并正在運作,我們可以通路http://localhost:5601(就是我們剛才開放Kibana的5601端口)
ABP 使用ElasticSearch、Kibana、Docker 進行日志收集

使用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(
			#34;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 = #34;{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(#34;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(
				#34;appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json",
				optional: true);
		})
		.UseSerilog();
           

然後運作一次你的程式,讓它自動建立好索引資訊,後面我們就隻需要配置了

kibana配置資訊#

  • 點選進入預設管理空間
ABP 使用ElasticSearch、Kibana、Docker 進行日志收集
  • 管理空間配置
ABP 使用ElasticSearch、Kibana、Docker 進行日志收集

Kibana 目前還不會顯示任何日志。您必須先指定索引,然後才能檢視記錄的資料。

這裡就可以看到logstash就是我們建立的索引(我之前沒有設定索引是以就預設是logstash-2022.03.06)

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

輸入你的索引模式。它将顯示剛剛建立的索引模式。您可以鍵入整個索引,或使用通配符。

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

在下一頁上,選擇 @timestamp 字段作為時間過濾器字段名稱,然後單擊建立索引模式按鈕。

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

您現在可以通過單擊導航窗格中的 Discover 連結來檢視日志。

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

我們程式中打出來的日志就會被收集到這裡,這裡我就不示範怎麼寫打日志的代碼了哈。(剛才上廁所尿劈叉了)

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

配置日志過期政策#

因為我們的日志資訊一般都不需要保留很長的時間。(一般儲存3天左右就夠了,過期的日志将自動清除,這樣也能減少我們日志記憶體的消耗)
ABP 使用ElasticSearch、Kibana、Docker 進行日志收集
  • 記得關掉熱階段的滾動更新
  • 開啟删除階段,設定過期時間,快照可以不用
ABP 使用ElasticSearch、Kibana、Docker 進行日志收集

關聯索引政策模式

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

選擇我們剛才設定的政策子產品,進行關聯。(這樣我們的日志就會自動釋放啦)

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

原文位址:https://www.cnblogs.com/chenxi001/p/15974197.html