建设摩托车网站,网站设置专栏有什么好处,seo站内站怎么做,广告投放效果上文我们演示了使用NLog向ElasticSearch写日志的基本过程(输出的是普通文本日志)#xff0c;今天我们来看下如何向ES输出结构化日志、在Kibana中分析日志。什么是结构化日志#xff1f;当前互联网、物联网、大数据突飞猛进#xff0c;软件越复杂#xff0c;查找任何给定问题… 上文我们演示了使用NLog向ElasticSearch写日志的基本过程(输出的是普通文本日志)今天我们来看下如何向ES输出结构化日志、在Kibana中分析日志。什么是结构化日志当前互联网、物联网、大数据突飞猛进软件越复杂查找任何给定问题的起因就越困难且成本更高。在实践中我们开发了各种规避、诊断应用程序错误行为的利器静态类型检查自动化测试事件探查器崩溃转储和监视系统。但是记录程序执行步骤的日志仍然是事后诊断最丰富的数据源。在日志分析时小批量普通的文本对于人类很友好但却很难从大量普通文本中快速定位、精准提取特定信息。.....
[2018-04-07T13:45:56.789Z INF] https://example.com/api/warehouse,query reserve,took 100 ms
[2018-04-07T13:45:56.789Z INF] api/commitOrder,OrderId:9876543210,commit order took 50 ms
......
[2018-04-07T13:45:56.789Z INF] /login,user:Kenny,from ip_address:127.0.0.1,took 100 ms
......
[2018-04-07T13:45:56.789Z INF] https://example.com/api/warehouse,OrderId:9876543210,decrease reserve took 10000 ms
[2018-04-07T13:45:56.789Z INF] /api/creatNewOrder,OrderId:9876543210, create order took 100 ms
.....
如果找到特定OrderId如何找到哪些请求耗时较长(比如大于2S)如何定位到该耗时请求处理管道中哪一段出现性能瓶颈出现性能瓶颈的请求占比普通文本对人类友好对于机器不友好。结构化日志提出了Message template来解决日志对机器不友好的问题。Messgae Template: 是一个与语言无关的规范捕获、(以对人类和机器友好的格式)呈现结构化的日志。var traceid _.TraceIdentifier;// 【锁定库存】 这个动作耗时较长
_logger.LogInformation({TraceId},{endpoint},OrderId:{orderId},decrease reserve took {elasped} ms, traceid, https://example.com/api/warehouse, 9876543210, 10000);
注意命名占位符它们能如格式化字符串占位符{0}{1}一样占位而且能将属性名称与每个匹配位置的消息数据相关联如下图以json格式提取了关键消息。消息模板的优势在于既能保持普通文本的格式又具备捕获结构化数据的能力(对机器友好)。下面来完整输出、分析提交订单请求的日志利用NLog向ES输出结构化日志NLog4.5引入结构化日志支持Message Template 在ASP.NET Core脚手架Startup文件---Configure方法添加如下代码 app.MapWhen(_ _.Request.Path.Value / ,appBuilder appBuilder.Run(_ {var traceid _.TraceIdentifier;// 查询库存_logger.LogInformation({traceId},{endpoint},query reserve,took{elasped} ms, traceid, https://example.com/api/warehouse, 100);// 创建订单_logger.LogInformation({traceId},{endpoint},OrderId:{orderId}, create order took {elasped} ms, traceid, /api/creatNewOrder, 9876543210, 100);// 锁定库存_logger.LogInformation({traceId},{endpoint},OrderId:{orderId},decrease reserve took {elasped} ms, traceid, https://example.com/api/warehouse, 9876543210, 10000);// 提交订单_logger.LogInformation({traceId},{endpoint},OrderId:{orderId},commit order took {elasped} ms, traceid, api/commitOrder, 9876543210, 50);_.Response.StatusCode StatusCodes.Status200OK;_.Response.WriteAsync(Generate Order OK!); return Task.CompletedTask;}));
这里我们关注如何向ElasticSearch输出结构化日志请务必将includeAllPropertiestrue,这样输出到ES的才会包含所有事件属性。target nameelastic xsi:typeBufferingWrapper flushTimeout5000target xsi:typeElasticSearch includeAllPropertiestrue indexlogstash-20200805 uri${configsetting:itemConnectionStrings.ElasticUrl} //target
Kibana中分析日志这个订单请求会产生6条日志(这里你也会看到日志的显示顺序可能不能如你所愿):下面给出[锁定库存]的日志ES文档上已经出现了关键的消息属性[traceId] [endpoint] [orderId] [elasped]{_index: logstash-20200805,_type: logevent,_id: emTivXMBwcdwe4RliB9f,_version: 1,_score: null,_source: {timestamp: 2020-08-05T17:10:00.717045608:00,level: Info,message: 2020-08-05 17:10:00.7170|INFO|EqidManager.Startup|0HM1P3TAGNJ5Q:00000001,https://example.com/api/warehouse,OrderId:9876543210,decrease reserve took 10000 ms,traceId: 0HM1P3TAGNJ5Q:00000001,endpoint: https://example.com/api/warehouse,orderId: 9876543210,elasped: 10000},fields: {timestamp: [2020-08-05T09:10:00.717Z]},sort: [1596618600717]
}
通过Kibana界面我们可以便捷地完成如下分析通过{TraceId}找到某次请求所有日志通过{elasped} 10s 过滤出处理时长大于10s的阶段通过{ordeid} 追踪该订单完整链路......总结本文肝时较长(elasped10天)从常规诊断日志谈到[对机器友好适用于分析的结构化日志]其中的核心是消息模板。再谈到我是如何利用NLog输出结构化日志其中注意在NLog Target中设置includeAllPropertiestrue(默认是false) 摸索了很久最后在Kibana中演示便捷的分析结构化日志干货周边也很重要[消息模板] https://messagetemplates.org/[如何利用NLog输出结构化日志] https://github.com/nlog/nlog/wiki/How-to-use-structured-logging[NLog to ES] https://github.com/markmcdowell/NLog.Targets.ElasticSearch[被忽略的TraceId可以用起来了]Logging with ElasticSearch, Kibana, ASP.NET Core and Docker如果本文对你有帮助不妨来个分享、点赞、在看三连