後續會根據公司使用的技術,進行技術整理分享,都是幹貨哦别忘了關注我!!!
最近上司想要我把項目日志進行一個統一收集,因為現在環境有什麼報錯資訊都是看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(
#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配置資訊#
- 點選進入預設管理空間
- 管理空間配置
Kibana 目前還不會顯示任何日志。您必須先指定索引,然後才能檢視記錄的資料。
這裡就可以看到logstash就是我們建立的索引(我之前沒有設定索引是以就預設是logstash-2022.03.06)
輸入你的索引模式。它将顯示剛剛建立的索引模式。您可以鍵入整個索引,或使用通配符。
在下一頁上,選擇 @timestamp 字段作為時間過濾器字段名稱,然後單擊建立索引模式按鈕。
您現在可以通過單擊導航窗格中的 Discover 連結來檢視日志。
我們程式中打出來的日志就會被收集到這裡,這裡我就不示範怎麼寫打日志的代碼了哈。(剛才上廁所尿劈叉了)
配置日志過期政策#
因為我們的日志資訊一般都不需要保留很長的時間。(一般儲存3天左右就夠了,過期的日志将自動清除,這樣也能減少我們日志記憶體的消耗)
- 記得關掉熱階段的滾動更新
- 開啟删除階段,設定過期時間,快照可以不用
關聯索引政策模式
選擇我們剛才設定的政策子產品,進行關聯。(這樣我們的日志就會自動釋放啦)
原文位址:https://www.cnblogs.com/chenxi001/p/15974197.html