点击上方蓝字

给一个关注吧

讲故事

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

  • 超级有用的TraceId,快点用起来吧!

  • 如何利用NLog输出结构化日志,并在Kibana优雅分析日志?

  • 既然能直接向ElasticSearch写日志,为什么还要logstash等日志摄取器?

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

  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.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.1ports:- "80:80"environment:- TZ=Asia/Shanghainetworks:- webnetlogging:driver: fluentdoptions:
#       fluentd-address: localhost:24224tag: eap-websiterestart: always
networks:webnet:external: truename: 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            1log_Level        infodaemon           offhttp_server      on    // 在宿主机作为http server启动http_listen      0.0.0.0http_port        2020storage.metrics  onParsers_File     parsers.conf
[INPUT]name             forwardmax_chunk_size   1Mmax_buffer_size  5M
[FILTER]Name  parserMatch *Key_Name log            // 要解析的字段Parser  docker          // 以docker日志格式解析,内容在parser.conf文件Preserve_Key   True     // 保留原解析的字段Reserve_Data   True     // 保留原始其他字段
[OUTPUT]name             esmatch            *host             es01port             9200logstash_format  onreplace_dots     onretry_limit      false

这样输出的结果就是:

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

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

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

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

  1. 容器内应用日志收集方案

    容器化应用日志收集挑战 应用日志的收集.分析和监控是日常运维工作重要的部分,妥善地处理应用日志收集往往是应用容器化重要的一个课题. Docker处理日志的方法是通过docker engine捕捉每一个 ...

  2. kubernetes高级之创建只读文件系统以及只读asp.net core容器

    使用docker创建只读文件系统 容器化部署对应用的运维带来了极大的方便,同时也带来一些新的安全问题需要考虑.比如黑客入侵到容器内,对容器内的系统级别或者应用级别文件进行修改,会造成难以估量的损失.( ...

  3. .NET Core容器化@Docker

    转自圣杰.https://www.jianshu.com/p/23465dc86d3e .NET Core容器化@Docker 圣杰 已关注 2017.12.22 21:59* 字数 2999 阅读 ...

  4. .NET Core 容器化调查

    前几天在微信朋友圈做了一个简单的调查,参与人数有500人,调查结果如下: 使用K8S的比例非常类似于2017年初我在公众号里针对.NET Core的使用情况的比例..NET Core是针对云原生应用开 ...

  5. .NET Core容器化之多容器应用部署@Docker-Compose

    1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理,然后再介绍多容器应用的部署问题. 2. Why Need Ngin ...

  6. Asp.Net Core 轻松学-利用日志监视进行服务遥测

    原文:Asp.Net Core 轻松学-利用日志监视进行服务遥测 前言     在 Net Core 2.2 中,官方文档表示,对 EventListener 这个日志监视类的内容进行了扩充,同时赋予 ...

  7. 如何在ASP.NET Core中编写自定义日志记录提供程序

    目录 介绍 如何实现所需的接口 基础类和附件 FileLoggerProvider具体类及其附件 1. ConfigureLogging() 2. appsettings.json文件 介绍 源代码可 ...

  8. Docker-HealthCheck指令探测ASP.NET Core容器健康状态

    写在前面 HealthCheck 不仅是对应用程序内运行情况.数据流通情况进行检查,还包括应用程序对外部服务或依赖资源的健康检查. 健康检查通常是以暴露应用程序的HTTP端点的形式实施,可用于配置健康 ...

  9. .NET Core容器化(Docker)

    1. 引言 我们知道. NET Core最大的特性之一就是跨平台,而对于跨平台,似乎大家印象中就是可以在非Windows系统上部署运行.而至于如何操作,可能就有所欠缺.那这一节我们就结合简单实例一步一 ...

最新文章

  1. 汇编语言w3c_w3cschoolc语言教程
  2. php企业网站源码安装教程,PHPSCUP企业建站系统v1.4 安装图文教程
  3. 西电计算机组装实验报告,西电模电实验报告(共7篇).docx
  4. python函数的传参要求_python中函数传参详解
  5. 值引用和引用问题分析
  6. Matlab Tricks( 八)—— 将 pgm 格式文件转换为 png 格式
  7. ulp java_java.lang.Math.ulp(float f)方法实例
  8. 解决Mac上“文本编码Unicode(UTF-8)“不适用的方法
  9. 【印刷数字识别】基于matlab OCR识别系统【含Matlab源码 438期】
  10. 建筑业建筑业大数据行业现状_建筑—第4部分
  11. 什么是Ajax? (转载于疯狂客的BLOG)
  12. 空间波束形成matlab仿真,自适应波束形成Matlab仿真
  13. 深度解析京东个性化推荐系统演进史
  14. 微信平台自动获取Token
  15. 利用百度点击原理提升关键词排名
  16. Unsupervised Domain Adaptive Re-Identification: Theory and Practice阅读总结
  17. 龙芯2k开发板Debian系统安装教程
  18. 【Android 开发】mac 版 Android Studio 连接夜神模拟器的方法
  19. ffmpeg音视频处理
  20. 【Git】Git修改 commit 的信息

热门文章

  1. 部署也是工程的一部分,也要编程(自动化)
  2. jQuery banner切换插件
  3. 页面上指定类型的控件的样式添加
  4. 昨天订了一台FSC Lifebook S6220
  5. java乘以2的位计算符号_java编程之:按位与运算,等运算规则
  6. 如何将世界时钟和时区小部件添加到您的iPhone
  7. 如何在PowerPoint演示文稿中使用iTunes音乐
  8. windows运行对话框_如何在Windows运行对话框中添加文本快捷方式?
  9. php判断外链,php检查字符串中是否有外链的方法
  10. 8-Python3从入门到实战—基础之数据类型(集合-Sets)