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

简介: 本文记录一套标准的、无侵入的的容器化应用日志收集方案:

本文记录一套标准的、无侵入的的容器化应用日志收集方案:


  1. 什么样的日志应该被收集?


  1. 如何输出为结构化日志?


  1. 使用EFK无侵入的收集分析日志


100ce73ebc1853d90f3d9a665610e8fb.png


定制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}  取得该条日志生产者的名字

启动应用日志长这样:


176fd20148fa1899be98224ae7c5cb9a.png


请保持所有应用日志的输出目标为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.1
    ports:
      - "80:80"
    environment:
      - TZ=Asia/Shanghai
    networks:
      - webnet
    logging:
      driver: fluentd
      options:
#       fluentd-address: localhost:24224
        tag: eap-website
    restart: always
networks:
  webnet:
    external: true
    name: eap-net


Fluentd Driver采集的格式如下 :


{
"container_id": "...",
"container_name": "...",
"source": "stdout",
"log": "This is log content"
}


容器应用产生的json日志(log字段)会被编码,这就很尴尬了,处心积虑的结构化日志没

有萃取出日志字段!!


e34a18ba5128acea1406053d3f1d37a8.png


多番搜索,在Fluentbit上找到Decoders 插件, 能将被编码的JSON字符串解码:

完整的fluent-bit.conf 如下:


[SERVICE]
    flush            1
    log_Level        info
    daemon           off
    http_server      on    // 在宿主机作为http server启动
    http_listen      0.0.0.0
    http_port        2020
    storage.metrics  on
    Parsers_File     parsers.conf
[INPUT]
    name             forward
    max_chunk_size   1M
    max_buffer_size  5M
[FILTER]
    Name  parser
    Match *
    Key_Name log            // 要解析的字段
    Parser  docker          // 以docker日志格式解析,内容在parser.conf文件
    Preserve_Key   True     // 保留原解析的字段
    Reserve_Data   True     // 保留原始其他字段
[OUTPUT]
    name             es
    match            *
    host             es01
    port             9200
    logstash_format  on
    replace_dots     on
    retry_limit      false


这样输出的结果就是:


d69d2c0392fe449407b2b1da598e18de.png


nice,后面就请自由在Kibana中分析日志吧。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
12月前
|
运维 监控 安全
2025 年 Splunk 的 5 大替代方案:企业日志管理工具新选择
Splunk 虽强大,但高昂成本和复杂性促使企业寻找替代方案。本文推荐 2025 年五大日志管理与安全分析工具:Log360、Elastic Security、Datadog、Graylog 和 Sumo Logic,涵盖开源、云原生与高性能方向,适配不同企业需求,助你提升安全与运维效率。
952 0
|
数据采集 自然语言处理 JavaScript
Playwright多语言生态:跨Python/Java/.NET的统一采集方案
随着数据采集需求的增加,传统爬虫工具如Selenium、Jsoup等因语言割裂、JS渲染困难及代理兼容性差等问题,难以满足现代网站抓取需求。微软推出的Playwright框架,凭借多语言支持(Python/Java/.NET/Node.js)、统一API接口和优异的JS兼容性,解决了跨语言协作、动态页面解析和身份伪装等痛点。其性能优于Selenium与Puppeteer,在学术数据库(如Scopus)抓取中表现出色。行业应用广泛,涵盖高校科研、大型数据公司及AI初创团队,助力构建高效稳定的爬虫系统。
898 2
Playwright多语言生态:跨Python/Java/.NET的统一采集方案
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
307 13
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
433 5
Visual Studio 快速分析 .NET Dump 文件
【11月更文挑战第10天】.NET Dump 文件是在 .NET 应用程序崩溃或出现问题时生成的,记录了应用程序的状态,包括内存对象、线程栈和模块信息。通过分析这些文件,开发人员可以定位和解决内存泄漏、死锁等问题。在 Visual Studio 中,可以通过调试工具、内存分析工具和符号加载等功能来详细分析 Dump 文件。此外,还可以使用第三方工具如 WinDbg 进行更深入的分析。
1345 1
|
消息中间件 存储 监控
微服务日志监控的挑战及应对方案
【10月更文挑战第23天】微服务化带来模块独立与快速扩展,但也使得日志监控复杂。日志作用包括业务记录、异常追踪和性能定位。
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
1418 8
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
521 2
|
开发框架 .NET Docker
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
301 1
|
开发框架 缓存 .NET
【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack Traces)
【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack Traces)
242 0