日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

一套标准的ASP.NET Core容器化应用日志收集分析方案

發布時間:2023/12/4 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一套标准的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":?{"LogLevel":?{"Microsoft":?"Warning","Microsoft.AspNetCore.Hosting.Diagnostics":?"Information",????//?提供給第三方調用API日志"Microsoft.Hosting.Lifetime":?"Information","Microsoft.EntityFrameworkCore.Database.Command":?"Information",??//數據庫操作sql日志"System.Net.Http.HttpClient":?"Information", // 應用內部發起的Http請求日志"Default":?"Warning"????//?除以上日志之外,記錄Warning+級別日志}}

    以上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-net

    Fluentd 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容器化应用日志收集分析方案的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。