一套标准的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="${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
[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应用的全过程, 可学习可商用。
一套标准的ASP.NET Core容器化应用日志收集分析方案的更多相关文章
- .NET Core容器化开发系列(零)——计划
.NET Core相当完善的跨平台特性以及其轻量化的底层接口为我们能顺畅进行微服务开发提供了非常棒的基础. 作为支撑微服务最常见的基础技术--容器化将是本系列的核心内容. 接下来我计划用一个月左右的时 ...
- kubernetes高级之创建只读文件系统以及只读asp.net core容器
系列目录 使用docker创建只读文件系统 容器化部署对应用的运维带来了极大的方便,同时也带来一些新的安全问题需要考虑.比如黑客入侵到容器内,对容器内的系统级别或者应用级别文件进行修改,会造成难以估量 ...
- 一题多解,ASP.NET Core应用启动初始化的N种方案[下篇]
[接上篇]"天下大势,分久必合,合久必分",ASP.NET应用通过GenericWebHostService这个承载服务被整合到基于IHostBuilder/IHost的服务承载系 ...
- .NET Core容器化之多容器应用部署@Docker-Compose
1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理,然后再介绍多容器应用的部署问题. 2. Why Need Ngin ...
- .NET Core容器化之多容器应用部署-使用Docker-Compose
原文补充: -- docker-compose.ymlversion: ' services: mvc-web: container_name: mvc.web.compose build: . re ...
- ASP.NET Core扩展库之日志
上一篇我们对Xfrogcn.AspNetCore.Extensions扩展库功能进行了简单的介绍,从这一篇文章开始,我将逐步介绍扩展库中的核心功能. 日志作为非业务的通用领域基础功能, ...
- Asp.net core 使用log4net作为日志组件,记录日志到本地。
原文:Asp.net core 使用log4net作为日志组件,记录日志到本地. GitHub demo :https://github.com/zhanglilong23/Asp.NetCore.D ...
- Asp.net Core + Log4net + ELK 搭建日志中心
原文:Asp.net Core + Log4net + ELK 搭建日志中心 Docker中一键安装ELK 对于这种工具类的东西,第一步就直接到docker的hub中查找了,很幸运,不仅有Elasti ...
- 利用 ELK 搭建 Docker 容器化应用日志中心
利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 ...
随机推荐
- python造一个计算器
正则表达式之简易计算器 关注公众号"轻松学编程"了解更多. 需求:使用正则表达式完成一个简易计算器. 功能:能够计算简单的表达式. 如:12((1+2)/(2+3)+1)*5.1- ...
- 被巴菲特看中的Snowflake,是怎样深刻改变云计算产业的?
众所周知,在很长一段时间里,巴菲特都从来不碰科技股.但人总是会变的,他在2016年开始首次持仓苹果,并在此后一再增持,目前苹果为伯克希尔第一大重仓股. 前不久,巴菲特持股了人生中的又一家科技公司--S ...
- CF1271E Common Number
数学+二分 连续打了3场$codeforces$,深深的被各种模拟贪心分类讨论的$C$,$D$题给恶心到了 还有永远看到题一脸懵的$B$题 首先考虑画出不同函数值迭代转移的关系,要注意考虑连边是否能成 ...
- Zookeeper-3.5.8集群搭建
大数据技术有着众多系统需要分布式协调服务,比如Hadoop.Kafka系统,其中主从切换.维护命名空间.以及分布式协调通知等场景,需要保证数据的分布式一致性. Zookeeper是业界最著名的分布式协 ...
- c#分割习题
2.从一个记录了学生成绩的文本文档,每个学生成绩是一行,每行是用 | 分割的数据,用 | 分割的域分别是姓名.年龄.成绩.年级,写程序取出各个年级成绩最高学生的成绩.年级放到集合中.提示:(1)使用 ...
- Pycharm激活码亲测有效,2020Pycharm最新激活码免费分享~
Pycharm激活码,亲测有效!!! 如果下边的Pycharm激活码过期失效了的话,大家可以关注微信公众号:Python联盟,然后回复"激活码"即可获取最新Pycharm永久激活码 ...
- Linux上传递文件到另外一个Linux服务器
现在的项目由于安全的需要,测试服务器被设置不能直接连接,想要连接的话,只能先登录一个服务器,然后以这个服务器为跳板,去登录另外一台真正的 服务器,即使是测试环境也只能这样操作.只能是相对来说安全一些. ...
- SpringMVC源码之Handler注册、获取以及请求controller中方法
总结 对requestMappingHandlerMapping进行initializeBean时register Handler http开始请求时,initHandlerMappings,Disp ...
- linux利用screen进行shell下的屏幕协作
我们都知道linux是支持多终端并行处理的 但是某些时候我们可能有比较特殊的需求需要两个人同时处理一个终端,screen 正好能满足这个要求 首先需要安装screen软件: debian和ubuntu ...
- RESTFul服务开发必备的一款IDEA插件!用了就离不开了
我们经常谈 RESTful Web 服务开发,但是我发现很多人实际就根本不懂这个概念.只是听着大家都这么说,也就跟着一起说了,哈哈哈! 因此,在开始推荐这个IDEA插件之前,非常有必要花一小会时间简单 ...