.net core Serilog + Elk(Elasticsearch、Logstash、Kibana) 部署Linux及使用
部署
Elasticsearch 官方地址 ,這里只需要裝ES 和Kibana 。 Serilog 會直接把數據寫入ES,繞開了 Logstash,所以不需要裝Logstash
Elasticsearch 部署
1. 方便后面集群通信,先創建網絡
docker network create elastic
2. 拉取鏡像。
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.11.1
3. 啟動容器
docker run --name es01 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" --net elastic -p 9200:9200 -itd -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.11.1
注意這里沒有掛載,正常生產環境應該把config,data,plugin全部掛載出來
啟動后默認會是https的,如果要關閉,修改elasticsearch.yml中一下配置,版本變化后可能配置不一樣
# 如果之前啟用了HTTPS,可能會有類似以下的設置 xpack.security.http.ssl.enabled: false
啟動成功后查看日志(docker logs [容器名稱]),會找到生產的密碼,證書和token等信息,保存到本地,方便使用

如果后期忘記了密碼和token,可以重新生成
重新生成token: docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana 重新生成密碼:docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elasticx
會生成ca證書,這里可以考到本地計算機方便使用
docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .
如果需要部署集群,請查看上面的官方文檔
啟動成功后輸入地址:https://ip:9200 。這里是https忽略瀏覽器的安全校驗 ,輸入 賬號:elastic 密碼:【上面啟動生成密碼】。成功后如下所示

Kibana 部署
1. 拉取 Kibana Docker 鏡像。
docker pull docker.elastic.co/kibana/kibana:8.11.0
2. 啟動 Kibana 容器
docker run --name kib01 --net elastic -p 5601:5601 -itd docker.elastic.co/kibana/kibana:8.11.0
這里生產環境需要把kibana.yml 掛載出來
訪問 http://ip:5601 。最開始初始化需要輸入Es啟動時生成的token。注意,上面生成的token會有過期時間,如果過期了請重新生成token

輸入后,查看 kibana 日志,會生成一個驗證碼,然后輸入進去就行了

輸入ES賬號密碼進行登錄

代碼實踐
1. 引入nuget包
Serilog.AspNetCore Serilog.Sinks.Elasticsearch ###以下配置是為了擴展其他的,只需要上面兩個包就行了 Serilog.Settings.Configuration Serilog.Sinks.Console Serilog.Sinks.Seq
2. 修改program.cs
builder.Host.UseSerilog();
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose() //最小日志記錄等級
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning) //指定程序集最小記錄級別
.MinimumLevel.Override("System", LogEventLevel.Warning)
.ReadFrom.Configuration(Configuration)
.Enrich.FromLogContext()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("https://192.168.0.236:9200"))
{
//傳送到ES中失敗的日志會進入這里
FailureCallback = e => {
Console.WriteLine("Unable to submit event " + e.MessageTemplate);
},
EmitEventFailure = EmitEventFailureHandling.WriteToSelfLog |
EmitEventFailureHandling.WriteToFailureSink |
EmitEventFailureHandling.RaiseCallback,
//FailureSink = new FileSink("./failures.txt", new JsonFormatter(), null), //如果日志發送不到ES則存放在這里
MinimumLogEventLevel = LogEventLevel.Information,
ModifyConnectionSettings = conn =>
conn.ServerCertificateValidationCallback((sender, certificate, chain, sslPolicyErrors) => true) // 禁用證書驗證
.ServerCertificateValidationCallback((sender, certificate, chain, errors) => true) // 禁用證書驗證
.ServerCertificateValidationCallback((sender, certificate, chain, policyErrors) => true) // 禁用證書驗證
.BasicAuthentication("elastic", "FyuSpCJMd2sX2iq27lKv"), // 如果啟用了基本身份驗證,這里要配置密碼
//.CertificateFingerprint("94fd0d932dc79ed50523612ecc49225c91dde29f33c697b92f05357df6ace879"),
//.ClientCertificate("./certs/http_ca.crt"),// 如果需要客戶端證書
IndexFormat = "physicaltest-{0:yyyy.MM.dd}",
//自動注冊模板
AutoRegisterTemplate = true,
//模板類型
AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv6,
//自定義模板名稱
//AutoRegisterTemplate = false,
//CustomFormatter = new ElasticsearchJsonFormatter(renderMessage: true),
//TemplateName="測試",
})
.CreateLogger();
注意:如果開啟了身份驗證,一定要設置賬號密碼才能訪問,本地使用了https+ip的形式,要禁用證書驗證,否則數據發送不到ES上面,會進入FailureCallback
3. 測試代碼
private IConfiguration _configuration;
private readonly ILogger<ValuesController> _logger;
public ValuesController(IConfiguration configuration, ILogger<ValuesController> logger)
{
_configuration = configuration;
_logger = logger;
}
/// <summary>
/// 測試日志
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
[HttpGet("GetTest")]
public IActionResult GetTest()
{
_logger.LogError("這是一條測試消息Erro");
Log.Error("這是一條測試錯誤日志");
return Ok();
}
4. 查看效果
如果程序正常,會在界面上會自動創建索引在Stack Management =》Index Management 中查看索引,如果沒有創建,看數據是否傳到了ES中

在Discover中創建data view進行匹配對應的索引,查看日志



浙公網安備 33010602011771號