一套标准的ASP.NET Core容器化应用日志收集分析方案
點擊上方藍字
給一個關(guān)注吧
講故事
關(guān)注我公眾號的朋友,應(yīng)該知道我寫了一些云原生應(yīng)用日志收集和分析相關(guān)的文章,其中內(nèi)容大多聚焦某個具體的組件:
超級有用的TraceId,快點用起來吧!
如何利用NLog輸出結(jié)構(gòu)化日志,并在Kibana優(yōu)雅分析日志????
既然能直接向ElasticSearch寫日志,為什么還要logstash等日志攝取器?
本文記錄一套標準的、無侵入的的容器化應(yīng)用日志收集方案:
什么樣的日志應(yīng)該被收集?
如何輸出為結(jié)構(gòu)化日志?
使用EFK無侵入的收集分析日志
定制ASP.NET Core日志;? ? ? ?將結(jié)構(gòu)化日志輸出到stdout;? ? ? ? ? ? ? ? ? ? ? ? ? ?
Fluentbit無侵入式轉(zhuǎn)發(fā)容器日志;? ??存儲在Es并在Kibana上分析日志。
定制ASP.NET Core日志
面向互聯(lián)網(wǎng)的經(jīng)典應(yīng)用,不外乎三部分日志:請求、業(yè)務(wù)處理、數(shù)據(jù)庫操作。
在實際采集日志時,關(guān)注[特定日志場景]:
提供給第三方調(diào)用的API(????有撕逼可能性)
核心流程業(yè)務(wù) (????996排障)
數(shù)據(jù)庫操作(????刪庫跑路可能性)
應(yīng)用內(nèi)部發(fā)起的Http請求?(????聯(lián)調(diào)撕逼)
Warn、Error、Fatal級別日志(????持續(xù)關(guān)注)
ASP.NETCore靈活的配置系統(tǒng)、可插拔的組件系統(tǒng),讓我們輕松配置日志、管理日志組件。
日志采集策略
ASP.NET Core應(yīng)用的日志配置取決于appsettings.{Environment}.json文件的Logging配置節(jié),
支持多個LogProvider、過濾日志、定制特定種類日志的收集級別。
以上Logging配置針對[特定日志場景],滿足經(jīng)典互聯(lián)網(wǎng)應(yīng)用的日志采集需求。
NLog Provider
結(jié)構(gòu)化日志提出[MessageTemplate]來解決傳統(tǒng)文本日志對機器不友好的問題。
① 這里使用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]將傳統(tǒng)文本日志轉(zhuǎn)換為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>與業(yè)務(wù)緊密相關(guān)的日志字符:
includeAllProperties="true" ?輸出日志條目的所有屬性
trace_id=${aspnet-TraceIdentifier:ignoreActivityId=true} ?取得trace_id,排障時很有用
user_id=${aspnet-user-identity} ?取得該條日志生產(chǎn)者的名字
啟動應(yīng)用日志長這樣:
請保持所有應(yīng)用日志的輸出目標為stdout,讓Fluent-bit無侵入采集!
....【TODO: 容器制作鏡像!!!!】 ...
Fluent-Bit收集容器日志
Fluent-bit采集日志,小巧夠用!
采集容器日志需要將容器應(yīng)用的Logging Driver改為[Fluentd]
Fluentd Driver默認會在宿主機24224端口監(jiān)聽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" }容器應(yīng)用產(chǎn)生的json日志(log字段)會被編碼,這就很尷尬了,處心積慮的結(jié)構(gòu)化日志沒有萃取出日志字段!!
多番搜索,在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日志格式解析,內(nèi)容在parser.conf文件Preserve_Key???True?????//?保留原解析的字段Reserve_Data???True?????//?保留原始其他字段 [OUTPUT]name?????????????esmatch????????????*host?????????????es01port?????????????9200logstash_format??onreplace_dots?????onretry_limit??????false這樣輸出的結(jié)果就是:
nice,后面就請自由在Kibana中分析日志吧。
完整的EFK收集容器日志的源碼配置,github傳送門:https://github.com/zaozaoniao/dockercompose-efk
以上就是小碼甲總結(jié)的使用EFK收集/分析容器化ASP.NET Core應(yīng)用日志的全過程, 可學(xué)習(xí)可商用。
總結(jié)
以上是生活随笔為你收集整理的一套标准的ASP.NET Core容器化应用日志收集分析方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Entity Framework Cor
- 下一篇: 如何在 C# 中使用 RabbitMQ