一套标准的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 ad8 ="${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.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字段)会被编码,这就很尴尬了,处心积虑的结构化日志没有萃取出日志字段!!
多番搜索,在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 [I 103d NPUT] 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应用的全过程, 可学习可商用。
- 基于Elasticsearch+Fluentd+Kibana的日志收集分析系统搭建与应用
- 基于logstash+elasticsearch+kibana的日志收集分析方案(Windows)
- [工会网站建设方案-日志]第一阶段 策划:收集、整理、分析
- Docker容器内应用的日志收集方案
- 容器内应用日志收集方案
- 容器内应用日志收集方案
- GC之详解CMS收集过程和日志分析
- linux日志系统的分析与应用
- 用Kibana和logstash快速搭建实时日志查询、收集与分析系统
- MapReduce 编程模型在日志分析方面的应用
- iOS应用崩溃日志分析
- 企业日志分析之linux系统history收集展示
- 基于Hadoop的日志收集框架---Chukwa的源码分析(数据处理)
- iOS应用的crash日志的分析基础
- 用Kibana和logstash快速搭建实时日志查询、收集与分析系统
- logstash开源日志收集查询分析系统
- ELK 日志收集实时分析大数据平台(简介)
- MapReduce 编程模型在日志分析方面的应用
- iOS应用崩溃日志分析
- Linux内核之旅/张凯捷—系统调用分析(3) (基于最新Linux-5.0版本系统调用日志收集系统)...