昆山苏州网站建设,做一个简单的网站多少钱,怎么创办app,地方门户网站建设点击上方蓝字给一个关注吧讲故事关注我公众号的朋友#xff0c;应该知道我写了一些云原生应用日志收集和分析相关的文章#xff0c;其中内容大多聚焦某个具体的组件#xff1a;超级有用的TraceId#xff0c;快点用起来吧#xff01;如何利用NLog输出结构化日志#xff0c… 点击上方蓝字给一个关注吧讲故事关注我公众号的朋友应该知道我写了一些云原生应用日志收集和分析相关的文章其中内容大多聚焦某个具体的组件超级有用的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.UseStartupStartup();});
② 编写NLog[JsonLayout]将传统文本日志转换为JSON格式日志?xml version1.0 encodingutf-8 ?
nlog xmlnshttp://www.nlog-project.org/schemas/NLog.xsdxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance autoReloadtrue internalLogFilelogs/nlog-internal.log internalLogLevelInfo targets asynctruetarget nameconsole xsi:typeConsolelayout xsi:typeJsonLayout includeAllPropertiestrue excludePropertiesEventId_Id,EventId_Name,EventIdattribute nametime layout${date:formatyyyy/MM/dd HH\:mm\:ss.fff zzz} /attribute namecategory layout${logger} /attribute namelog_level layout${level:lowerCasetrue} /attribute namemessage layout${message} /attribute nametrace_id layout${aspnet-TraceIdentifier:ignoreActivityIdtrue} /attribute nameuser_id layout${aspnet-user-identity} /attribute nameexception layout${exception:formattostring} //layout/target/targetsruleslogger name* minlevelInfo writeToconsole ruleNameconsole //rules
/nlog
与业务紧密相关的日志字符includeAllPropertiestrue 输出日志条目的所有属性trace_id${aspnet-TraceIdentifier:ignoreActivityIdtrue} 取得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.7services:website:image: ${DOCKER_REGISTRY}/eap/website:0.1ports:- 80:80environment:- TZAsia/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应用日志的全过程 可学习可商用。