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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文记录一套标准的、无侵入的的容器化应用日志收集方案:

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


  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中分析日志吧。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6天前
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
|
6天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
23 0
|
6天前
|
Linux API iOS开发
.net core 优势
.NET Core 的优势:跨平台兼容(Windows, macOS, Linux)及容器支持,高性能,支持并行版本控制,丰富的新增API,以及开源。
29 4
|
6天前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。
|
6天前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
49 0
|
6天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
33 0
|
6天前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
123 5
|
9月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
126 0
|
10月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
67 0
|
10月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
121 0