Logging with ElasticSearch, Kibana, ASP.NET Core and Docker

“好久不見,前兩周經(jīng)歷了人生第一次"偽牛市",基金和股市大起大落,更加堅信“你永遠賺不到超出你認知范圍之外的錢,除非靠著運氣”,老韭菜誠不欺我也。
當能力與野心不匹配,只能多看書,收割那些不求甚解的韭菜。
言歸正傳,本文聊一聊在ASP.NET Core3.1中集成ElasticSearch、Kibana日志查詢系統(tǒng)。
我們?yōu)槭裁葱枰狤lasticSearch、Kibana?
成熟的應用程序,會在各個階段以各種姿勢記錄日志,這些日志包括(但不限于)nginx日志、pod/Container、業(yè)務日志。
ElasticSearch是一個高度可擴展的全文搜索和分析引擎,使任何類型的日志記錄變得容易,可訪問和可搜索。ElasticSearch令人難以置信的速度和簡單的查詢語言,再加上Kibana的界面和圖形,構成了功能強大的日志存儲和查詢搭檔。
1.在Docker中啟動ElasticSearch、Kibana
docker中啟動Elastcisearch、kibana最簡單的方式是創(chuàng)建docker-compose文件,將原服務偵聽端口映射到宿主機端口。
version:?'3.1'
services:
??elasticsearch:
???container_name:?elasticsearch
???image:?elasticsearch:7.6.2
???ports:
????-?9200:9200
???volumes:
????-?elasticsearch-data:/usr/share/elasticsearch/data
???environment:
????-?xpack.monitoring.enabled=true
????-?xpack.watcher.enabled=false
????-?"ES_JAVA_OPTS=-Xms1g?-Xmx1g"
????-?discovery.type=single-node
???networks:
????-?elastic
??kibana:
???container_name:?kibana
???image:?kibana:7.6.2
???ports:
????-?5601:5601
???depends_on:
????-?elasticsearch
???environment:
????-?ELASTICSEARCH_URL=http://localhost:9200
???networks:
????-?elastic
??
networks:
??elastic:
????driver:?bridge
volumes:
??elasticsearch-data:
在后臺拉取鏡像,啟動容器:
docker-compose??up?-d
確認ElasticSearch,kibana啟動成功:

2. 使用ASP.NET Core和NLog向ES發(fā)送日志
VS Code創(chuàng)建.NetCore程序
dotnet?new?mvc?--no-https?-o?Elastic.Kibana.NLog
cd?Elastic.Kibana.NLog
添加NLog依賴包
dotnet?add?package?NLog
dotnet?add?package?NLog.Web.AspNetCore
dotnet?add?package?NLog.Targets.ElasticSearch
添加nlog.config文件,黃色背景行是NLog直接向ES發(fā)送日志的核心配置。
"1.0"?encoding="utf-8"??>
"http://www.nlog-project.org/schemas/NLog.xsd"
??????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??????autoReload="true"
??????internalLogLevel="Info"
??????internalLogFile="internal-nlog.txt">
??
??
????"NLog.Web.AspNetCore"/>
??
??
??
????
????type="File"?name="allfile"?fileName="/home/root/nlog-all-${shortdate}.log"
????????????layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message}?${exception:format=tostring}"?/>
????
????type="File"?name="ownFile-web"?fileName="/home/root/nlog-own-${shortdate}.log"
????????????layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message}?${exception:format=tostring}|url:?${aspnet-request-url}|action:?${aspnet-mvc-action}"?/>
????"elastic" ?xsi:type="BufferingWrapper"?flushTimeout="5000">
??????type="ElasticSearch"?uri="http://localhost:9200/"?/>
????
??
??
??
????
????"*"?minlevel="Trace"?writeTo="allfile"?/>
????
????"Microsoft.*"?maxlevel="Info"?final="true"?/>
????
????"*"?minlevel="Trace"?writeTo="ownFile-web"?/>
????"*" ?minlevel="Info"?writeTo="elastic"?/>
??
ASP.NET Core添加Nlog并輸出日志
????public?class?Program
????{
????????public?static?void?Main(string[]?args)
????????{
????????????var?webHost?=?WebHost.CreateDefaultBuilder(args)
?????????????????????.ConfigureLogging((hostingContext,?loggingBuilder)?=>
?????????????????????{
?????????????????????????loggingBuilder.AddConsole(x?=>?x.IncludeScopes?=?true).AddDebug();
?????????????????????})
?????????????????????.UseNLog()
?????????????????????.UseStartup()
?????????????????????.Build();
????????????webHost.Run();
????????}
????}
Controller自定義日志:
public?class?HomeController?:?Controller
????{
????????private?readonly?ILogger?_logger;
????????public?HomeController(ILogger?logger)
????????{
????????????_logger?=?logger;
????????}
????????public?IActionResult?Index()
????????{
???????????_logger.LogInformation("HomeController?Index?executed?at?{date}",?DateTime.UtcNow);
????????????return?View();
????????}
????}
3.在kibana中創(chuàng)建Index Pattern
dotnet run啟動ASP.NET Core程序,現(xiàn)在開始產(chǎn)生日志。
Kibana使用index pattern從ElasticSearch indices中獲取數(shù)據(jù)。要在Kibana中顯示日志,需要先定義index pattern:
之后選擇@timestamp時間過濾。
回到Discovery界面,可以看到所有日志。

ok, 上面便是ASP.NET Core+NLog集成ES、Kibana的基本操作流程。
看起來很簡單,其實只是九牛一毛,Elastic Stack的內功博大精深,關注我,解鎖各種實戰(zhàn)姿勢。
