博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一套标准的ASP.NET Core容器化应用日志收集分析方案
阅读量:4033 次
发布时间:2019-05-24

本文共 3783 字,大约阅读时间需要 12 分钟。

点击上方蓝字

给一个关注吧

讲故事

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

  •    

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

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

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

  3. 使用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.AspNetCoreinternal 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格式日志:

  
    
      
        
        
        
        
        
        
        
              
    
  

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

  • 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.1    ports:      - "80:80"    environment:      - TZ=Asia/Shanghai    networks:      - webnet    logging:      driver: fluentd      options:#       fluentd-address: localhost:24224        tag: eap-website    restart: alwaysnetworks:  webnet:    external: true    name: 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            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

这样输出的结果就是:

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

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

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

转载地址:http://wmkdi.baihongyu.com/

你可能感兴趣的文章
[leetCode By Python] 14. Longest Common Prefix
查看>>
[leetCode By Python]111. Minimum Depth of Binary Tree
查看>>
[LeetCode By Python]118. Pascal's Triangle
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
[LeetCode By Python]122. Best Time to Buy and Sell Stock II
查看>>
[LeetCode By Python]125. Valid Palindrome
查看>>
[LeetCode By Python]136. Single Number
查看>>
[LeetCode By Python]172. Factorial Trailing Zeroes
查看>>
[LeetCode By MYSQL] Combine Two Tables
查看>>
python jieba分词模块的基本用法
查看>>
[CCF BY C++]2017.12 最小差值
查看>>
[CCF BY C++]2017-12 游戏
查看>>
如何打开ipynb文件
查看>>
[Leetcode BY python ]190. Reverse Bits
查看>>
Android下调用收发短信邮件等(转载)
查看>>
Android中电池信息(Battery information)的取得
查看>>
SVN客户端命令详解
查看>>
Android/Linux 内存监视
查看>>
Linux系统信息查看
查看>>
用find命令查找最近修改过的文件
查看>>