Logging with ElasticSearch, Kibana, ASP.NET Core and Docker

好久不见,前两周经历了人生第一次"伪牛市",基金和股市大起大落,更加坚信“你永远赚不到超出你认知范围之外的钱,除非靠着运气”,老韭菜诚不欺我也。
当能力与野心不匹配,只能多看书,收割那些不求甚解的韭菜。

言归正传,本文聊一聊在ASP.NET Core3.1中集成ElasticSearch、Kibana日志查询系统。

我们为什么需要ElasticSearch、Kibana?

成熟的应用程序,会在各个阶段以各种姿势记录日志,这些日志包括(但不限于)nginx日志、pod/Container、业务日志。
ElasticSearch是一个高度可扩展的全文搜索和分析引擎,使任何类型的日志记录变得容易,可访问和可搜索。ElasticSearch令人难以置信的速度和简单的查询语言,再加上Kibana的界面和图形,构成了功能强大的日志存储和查询搭档。

1.在Docker中启动ElasticSearch、Kibana

docker中启动Elastcisearch、kibana最简单的方式是创建docker-compose文件,将原服务侦听端口映射到宿主机端口。

version: '3.1'services:elasticsearch:container_name: elasticsearchimage: elasticsearch:7.6.2ports:- 9200:9200volumes:- elasticsearch-data:/usr/share/elasticsearch/dataenvironment:- xpack.monitoring.enabled=true- xpack.watcher.enabled=false- "ES_JAVA_OPTS=-Xms1g -Xmx1g"- discovery.type=single-nodenetworks:- elastickibana:container_name: kibanaimage: kibana:7.6.2ports:- 5601:5601depends_on:- elasticsearchenvironment:- ELASTICSEARCH_URL=http://localhost:9200networks:- elasticnetworks:elastic:driver: bridgevolumes:elasticsearch-data:

在后台拉取镜像,启动容器:

docker-compose  up -d

确认ElasticSearch,kibana启动成功:

2. 使用ASP.NET Core和NLog向ES发送日志

VS Code创建.NetCore程序

dotnet new mvc --no-https -o Elastic.Kibana.NLog
cd Elastic.Kibana.NLog

添加NLog依赖包

dotnet add package NLog
dotnet add package NLog.Web.AspNetCore
dotnet add package NLog.Targets.ElasticSearch

添加nlog.config文件,黄色背景行是NLog直接向ES发送日志的核心配置。

<?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"internalLogLevel="Info"internalLogFile="internal-nlog.txt"><!-- enable asp.net core layout renderers --><extensions><add assembly="NLog.Web.AspNetCore"/></extensions><!-- the targets to write to --><targets><!-- write logs to file  --><target xsi:type="File" name="allfile" fileName="/home/root/nlog-all-${shortdate}.log"layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" /><!-- another file log, only own logs. Uses some ASP.NET core renderers --><target xsi:type="File" name="ownFile-web" fileName="/home/root/nlog-own-${shortdate}.log"layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" /><target name="elastic" xsi:type="BufferingWrapper" flushTimeout="5000"><target xsi:type="ElasticSearch" uri="http://localhost:9200/" /></target></targets><!-- rules to map from logger name to target --><rules><!--All logs, including from Microsoft--><logger name="*" minlevel="Trace" writeTo="allfile" /><!--Skip non-critical Microsoft logs and so log only own logs--><logger name="Microsoft.*" maxlevel="Info" final="true" /><!-- BlackHole without writeTo --><logger name="*" minlevel="Trace" writeTo="ownFile-web" /><logger name="*" minlevel="Info" writeTo="elastic" /></rules>
</nlog>

ASP.NET Core添加Nlog并输出日志

    public class Program{public static void Main(string[] args){var webHost = WebHost.CreateDefaultBuilder(args).ConfigureLogging((hostingContext, loggingBuilder) =>{loggingBuilder.AddConsole(x => x.IncludeScopes = true).AddDebug();}).UseNLog().UseStartup<Startup>().Build();webHost.Run();}}

Controller自定义日志:

public class HomeController : Controller{private readonly ILogger<HomeController> _logger;public HomeController(ILogger<HomeController> logger){_logger = logger;}public IActionResult Index(){_logger.LogInformation("HomeController Index executed at {date}", DateTime.UtcNow);return View();}}

3.在kibana中创建Index Pattern

dotnet run启动ASP.NET Core程序,现在开始产生日志。
Kibana使用index patternElasticSearch indices中获取数据。要在Kibana中显示日志,需要先定义index pattern:之后选择@timestamp时间过滤。

回到Discovery界面,可以看到所有日志。

ok, 上面便是ASP.NET Core+NLog集成ES、Kibana的基本操作流程。
看起来很简单,其实只是九牛一毛,Elastic Stack的内功博大精深,关注我,解锁各种实战姿势。

  • ASP.NET Core端点路由 作用原理

  • [温故知新] 编程原则和模式

  • ASP.NET Core结合Redis实践消息队列

  • Quartz.net在集群环境下部署任务的姿势

  • 分享我在前后端分离项目中Gitlab-CI的经验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Spring5]IOC容器_Bean管理_工厂Bean

IOC操作Bean管理&#xff08;FactoryBean&#xff09; 1.Spring有两种类型bean&#xff0c;一种普通bean&#xff0c;另外一种工厂bean&#xff08;FactoryBean&#xff09; 2.普通bean&#xff1a;在配置文件中定义bean类型就是返回类型 3.工厂bean&#xff1a;在配置文件定…

Redis 6.0 新特性 ACL 介绍

Redis 6.0 新特性 ACL 介绍Intro在 Redis 6.0 中引入了 ACL&#xff08;Access Control List) 的支持&#xff0c;在此前的版本中 Redis 中是没有用户的概念的&#xff0c;其实没有办法很好的控制权限&#xff0c;redis 6.0 开始支持用户&#xff0c;可以给每个用户分配不同的权…

[Spring5]IOC容器_Bean管理_bean的作用域和bean的生命周期

IOC操作Bean管理&#xff08;bean作用域&#xff09; 1.在Spring里面&#xff0c;设置创建bean实例是单实例还是多实例 2.在Spring里面&#xff0c;默认情况下&#xff0c;bean是单实例对象 package com.atguigu.spring.test;import com.atguigu.spring.collectiontype.Book…

创建型设计模式总结

创建型设计模式总结Intro前面几篇文章已经把创建型设计模式都介绍了&#xff0c;来做一个简单的总结。创建型设计模式&#xff0c;就是用来创建对象的设计模式&#xff0c;根据要创建的对象的复杂度以及是否允许多实例以及是否需要容易扩展等多方面考虑去选择合适的设计模式来创…

手动造轮子——为Ocelot集成Nacos注册中心

前言近期在看博客的时候或者在群里看聊天的时候&#xff0c;发现很多都提到了Ocelot网关的问题。我之前也研究过一点&#xff0c;网关本身是一种通用的解决方案&#xff0c;主要的工作就是拦截请求统一处理&#xff0c;比如认证、授权、熔断、限流、注册发现、负载均衡等等。随…

[Spring5]IOC容器_Bean管理XML方式_自动装配

IOC操作Bean管理&#xff08;xml自动装配&#xff09; package com.atguigu.spring.autowire;public class Dept {Overridepublic String toString() {return "Dept{}";} }package com.atguigu.spring.autowire;public class Emp {private Dept dept;public void se…

程序员修神之路--简约而不简单的分布式通信基石

点击“蓝字”关注&#xff0c;领取架构书籍菜菜哥&#xff0c;请教一个问题呗面试又被卡住了&#xff1f;还是你了解我呀&#xff0c;tcp协议面向连接是怎么回事呢&#xff1f;这个说详细起来&#xff0c;那本好几百页的tcp协议的书籍你倒是可以看看分布式系统可以总结为是处于…

[Spring5]IOC容器_Bean管理XML方式_外部属性文件

IOC操作Bean管理&#xff08;外部属性文件&#xff09; 1.直接配置数据库信息 &#xff08;1&#xff09;配置德鲁伊druid连接池 &#xff08;2&#xff09;引入德鲁伊druid连接池依赖jar包 <!--直接配置连接池--><bean id "dataSource" class "c…

[Spring5]IOC容器_Bean管理注解方式_创建对象

IOC操心Bean管理&#xff08;基于注解方式&#xff09; 1.什么是注解 &#xff08;1&#xff09;注解是代码特殊标记&#xff0c;格式&#xff1a;注解名称(属性名称属性值,属性名称属性值…) &#xff08;2&#xff09;使用注解&#xff0c;注解作用在类上面&#xff0c;方…

一个有趣的问题, 你知道SqlDataAdapter中的Fill是怎么实现的吗

一&#xff1a;背景1. 讲故事最近因为各方面原因换了一份工作&#xff0c;去了一家主营物联柜的公司&#xff0c;有意思的是物联柜上的终端是用 wpf 写的&#xff0c;代码也算是年久失修&#xff0c;感觉技术债还是蛮重的&#xff0c;前几天在调试一个bug的时候&#xff0c;看到…

[Spring5]IOC容器_Bean管理注解方式_组件扫描配置细节

开启组件扫描细节配置 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springf…

一文说通C#中的异步编程

天天写&#xff0c;不一定就明白。又及&#xff0c;前两天看了一个关于同步方法中调用异步方法的文章&#xff0c;里面有些概念不太正确&#xff0c;所以整理了这个文章。一、同步和异步。先说同步。同步概念大家都很熟悉。在异步概念出来之前&#xff0c;我们的代码都是按同步…

[Spring5]IOC容器_Bean管理注解方式_注入属性@Autowired_@Qualified_@Resource_@Value

基于注解方式实现属性注入 &#xff08;1&#xff09;AutoWired&#xff1a;根据属性类型进行自动装配 第一步 把service和dao对象创建&#xff0c;在service和dao类添加创建对象注解 第二步 在service注入dao对象&#xff0c;在service类添加dao类型属性&#xff0c;在属性…

.Net Core in Docker极简入门(上篇)

点击上方蓝字"小黑在哪里"关注我吧环境准备Docker基础概念Docker基础命令Docker命令实践构建Docker镜像Dockerfilebulid & run前言Docker 是一个开源的应用容器引擎&#xff0c;它十分火热&#xff0c;如今几乎成为了后端开发人员必须掌握的一项技能。即使你在生…

ASP.NET Core中的内存缓存

ASP.NET Core中的内存中缓存让我们看看如何通过缓存优化ASP.NET Core应用程序性能我相信&#xff0c;在我们的工作中&#xff0c;每个人都收到来自客户的请求或来自我们应用程序用户的反馈&#xff0c;以提高响应速度。如果在编写代码时仅使用最佳实践还不够&#xff0c;那么我…

[Spring5]IOC容器_Bean管理注解方式_完全注解开发

完全注解开发 &#xff08;1&#xff09;创建配置类&#xff0c;替代xml配置文件 package com.atguigu.spring.config;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;Configuration //作为配置…

ASP.NET Core在 .NET 5 Preview 7的更新

.NET 5 Preview 7现在可以用了&#xff0c;可以进行评估了。这是此版本中的新增功能&#xff1a;Blazor WebAssembly应用程序现在针对.NET 5更新了Blazor WebAssembly的调试要求Blazor的可访问性改进Blazor的性能改进证书认证性能改进发送HTTP/2 PING帧支持Kestrel套接字传输中…

[Spring5]AOP底层原理

AOP底层原理 1.AOP底层使用动态代理 &#xff08;1&#xff09;有两种情况动态代理 第一种 有接口的情况&#xff0c;使用JDK动态代理 a.创建接口实现类代理对象&#xff0c;增强类的方法 第二种 没有接口的情况&#xff0c;使用CGLIB动态代理 a.创建子类的代理对象&#…

Hangfire定时触发作业,好像很简单?

【导读】本节我们继续稍微详细讲讲在我没有详细了解源码的前提下来探讨通过Hangfire定时触发作业有哪些需要注意的事项间隔时间内执行作业举个栗子&#xff0c;每隔10秒监控系统CPU&#xff0c;若CPU飙高&#xff08;根据实际业务定义百分比&#xff09;则在控制台打印输出&…

[Swagger2]Swagger简介

Swagger简介 前后端分离 前端 -> 前端控制层、视图层 后端 -> 后端控制层、服务层、数据访问层 前后端通过API进行交互 前后端相对独立且松耦合 产生的问题 前后端集成&#xff0c;前端或者后端无法做到“及时协商&#xff0c;尽早解决”&#xff0c;最终导致问题…