一套标准的ASP.NET Core容器化应用日志收集分析方案
點擊上方藍字
給一個關注吧
講故事
關注我公眾號的朋友,應該知道我寫了一些云原生應用日志收集和分析相關的文章,其中內容大多聚焦某個具體的組件:
超級有用的TraceId,快點用起來吧!
如何利用NLog輸出結構化日志,并在Kibana優雅分析日志????
既然能直接向ElasticSearch寫日志,為什么還要logstash等日志攝取器?
本文記錄一套標準的、無侵入的的容器化應用日志收集方案:
什么樣的日志應該被收集?
如何輸出為結構化日志?
使用EFK無侵入的收集分析日志
定制ASP.NET Core日志;? ? ? ?將結構化日志輸出到stdout;? ? ? ? ? ? ? ? ? ? ? ? ? ?
Fluentbit無侵入式轉發容器日志;? ??存儲在Es并在Kibana上分析日志。
定制ASP.NET Core日志
面向互聯網的經典應用,不外乎三部分日志:請求、業務處理、數據庫操作。
在實際采集日志時,關注[特定日志場景]:
提供給第三方調用的API(????有撕逼可能性)
核心流程業務 (????996排障)
數據庫操作(????刪庫跑路可能性)
應用內部發起的Http請求?(????聯調撕逼)
Warn、Error、Fatal級別日志(????持續關注)
ASP.NETCore靈活的配置系統、可插拔的組件系統,讓我們輕松配置日志、管理日志組件。
日志采集策略
ASP.NET Core應用的日志配置取決于appsettings.{Environment}.json文件的Logging配置節,
支持多個LogProvider、過濾日志、定制特定種類日志的收集級別。
以上Logging配置針對[特定日志場景],滿足經典互聯網應用的日志采集需求。
NLog Provider
結構化日志提出[MessageTemplate]來解決傳統文本日志對機器不友好的問題。
① 這里使用NLog Provider接管所有的日志輸出
//?Please??install-package?NLog.Web.AspNetCore internal?static?IHostBuilder?CreateHostBuilder(string[]?args)?=>Host.CreateDefaultBuilder(args).ConfigureLogging((hostBuilder,?loggerBuilder)?=>{loggerBuilder.ClearProviders();loggerBuilder.AddNLog("nlog.production.config");}).ConfigureWebHostDefaults(webBuilder?=>{webBuilder.UseStartup<Startup>();});② 編寫NLog[JsonLayout]將傳統文本日志轉換為JSON格式日志:
<?xml?version="1.0"?encoding="utf-8"??> <nlog?xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?autoReload="true"?internalLogFile="logs/nlog-internal.log"?internalLogLevel="Info"?><targets?async="true"><target?name="console"?xsi:type="Console"><layout?xsi:type="JsonLayout"?includeAllProperties="true"?excludeProperties="EventId_Id,EventId_Name,EventId"><attribute?name="time"?layout="${date:format=yyyy/MM/dd?HH\:mm\:ss.fff?zzz}"?/><attribute?name="category"?layout="${logger}"?/><attribute?name="log_level"?layout="${level:lowerCase=true}"?/><attribute?name="message"?layout="${message}"?/><attribute?name="trace_id"?layout="${aspnet-TraceIdentifier:ignoreActivityId=true}"?/><attribute?name="user_id"?layout="${aspnet-user-identity}"?/><attribute?name="exception"?layout="${exception:format=tostring}"?/></layout></target></targets><rules><logger?name="*"?minlevel="Info"?writeTo="console"???ruleName="console"?/></rules> </nlog>與業務緊密相關的日志字符:
includeAllProperties="true" ?輸出日志條目的所有屬性
trace_id=${aspnet-TraceIdentifier:ignoreActivityId=true} ?取得trace_id,排障時很有用
user_id=${aspnet-user-identity} ?取得該條日志生產者的名字
啟動應用日志長這樣:
請保持所有應用日志的輸出目標為stdout,讓Fluent-bit無侵入采集!
....【TODO: 容器制作鏡像!!!!】 ...
Fluent-Bit收集容器日志
Fluent-bit采集日志,小巧夠用!
采集容器日志需要將容器應用的Logging Driver改為[Fluentd]
Fluentd Driver默認會在宿主機24224端口監聽Forward消息 。
一個簡單的容器Docker-compose示例:
version:?"3.7"services:website:image:?${DOCKER_REGISTRY}/eap/website:0.1ports:-?"80:80"environment:-?TZ=Asia/Shanghainetworks:-?webnetlogging:driver:?fluentdoptions: #???????fluentd-address:?localhost:24224tag:?eap-websiterestart:?always networks:webnet:external:?truename:?eap-netFluentd Driver采集的格式如下 :
{ "container_id":?"...", "container_name":?"...", "source":?"stdout", "log":?"This?is?log?content" }容器應用產生的json日志(log字段)會被編碼,這就很尷尬了,處心積慮的結構化日志沒有萃取出日志字段!!
多番搜索,在Fluentbit上找到Decoders 插件, 能將被編碼的JSON字符串解碼:
完整的fluent-bit.conf 如下:
[SERVICE]flush????????????1log_Level????????infodaemon???????????offhttp_server??????on????//?在宿主機作為http?server啟動http_listen??????0.0.0.0http_port????????2020storage.metrics??onParsers_File?????parsers.conf [INPUT]name?????????????forwardmax_chunk_size???1Mmax_buffer_size??5M [FILTER]Name??parserMatch?*Key_Name?log????????????//?要解析的字段Parser??docker??????????//?以docker日志格式解析,內容在parser.conf文件Preserve_Key???True?????//?保留原解析的字段Reserve_Data???True?????//?保留原始其他字段 [OUTPUT]name?????????????esmatch????????????*host?????????????es01port?????????????9200logstash_format??onreplace_dots?????onretry_limit??????false這樣輸出的結果就是:
nice,后面就請自由在Kibana中分析日志吧。
完整的EFK收集容器日志的源碼配置,github傳送門:https://github.com/zaozaoniao/dockercompose-efk
以上就是小碼甲總結的使用EFK收集/分析容器化ASP.NET Core應用日志的全過程, 可學習可商用。
總結
以上是生活随笔為你收集整理的一套标准的ASP.NET Core容器化应用日志收集分析方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Entity Framework Cor
- 下一篇: 如何在 .NET 中使用 Redis缓存