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以上版本),根據個人情況決定
- 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
- I18N_LOCALE="zh-CN"
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天左右就夠了,過期的日志將自動清除,這樣也能減少我們日志內存的消耗)
- 記得關掉熱階段的滾動更新
- 開啟刪除階段,設置過期時間,快照可以不用
關聯索引策略模式
選擇我們剛才設置的策略模塊,進行關聯。(這樣我們的日志就會自動釋放啦)