asp.net webservice启动日志_一套标准的ASP.NET Core容器化应用日志收集分析方案

4a7357428e97a6ed617b5f291c5c46a0.gif

点击上方蓝字

给一个关注吧

讲故事

关注我公众号的朋友,应该知道我写了一些云原生应用日志收集和分析相关的文章,其中内容大多聚焦某个具体的组件:

  • 超级有用的TraceId,快点用起来吧!
  • 如何利用NLog输出结构化日志,并在Kibana优雅分析日志?   
  • 既然能直接向ElasticSearch写日志,为什么还要logstash等日志摄取器?

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

  1. 什么样的日志应该被收集?
  2. 如何输出为结构化日志?
  3. 使用EFK无侵入的收集分析日志
1484aa86f47bfe45e9b437b85cc98c29.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();
              });

② 编写NLog[JsonLayout]将传统文本日志转换为JSON格式日志:

<?xml  version="1.0" encoding="utf-8" ?>
"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" >"true">"console" xsi:type="Console">type="JsonLayout" includeAllProperties="true" excludeProperties="EventId_Id,EventId_Name,EventId">"time" layout="${date:format=yyyy/MM/dd HH\:mm\:ss.fff zzz}" />"category" layout="${logger}" />"log_level" layout="${level:lowerCase=true}" />"message" layout="${message}" />"trace_id" layout="${aspnet-TraceIdentifier:ignoreActivityId=true}" />"user_id" layout="${aspnet-user-identity}" />"exception" layout="${exception:format=tostring}" />"*" minlevel="Info" writeTo="console"   ruleName="console" />

与业务紧密相关的日志字符:

  • includeAllProperties="true"  输出日志条目的所有属性
  • trace_id=${aspnet-TraceIdentifier:ignoreActivityId=true}  取得trace_id,排障时很有用
  • user_id=${aspnet-user-identity}  取得该条日志生产者的名字

启动应用日志长这样:

62cf9a994abac8c85565e315d7e30334.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字段)会被编码,这就很尴尬了,处心积虑的结构化日志没有萃取出日志字段!!d39a4d33b54990345c3a63440f4b2b88.png

7050ecf7868c80e5a26c8bf68a44454d.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

这样输出的结果就是:

0d1cc36fa972a51766e89cde42f0da22.pngnice,后面就请自由在Kibana中分析日志吧。

684ac1f4be72cc977c6814e9592f7d1e.png

完整的EFK收集容器日志的源码配置,github传送门:https://github.com/zaozaoniao/dockercompose-efk

以上就是小码甲总结的使用EFK收集/分析容器化ASP.NET Core应用日志的全过程, 可学习可商用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值