Elasticsearch,Kibana,Logstash,NLog实现ASP.NET Core 分布式日志系统
Elasticsearch - 简介
Elasticsearch 作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST API 来搜索数据。它使用 Java 编写,基于 Apache Lucene,尽管这些细节隐藏在 API 中。通过被索引的字段,可以用许多不同的聚合方式找到任何被存储(索引)的文档。但是,ElasticSearch不仅仅只提供对这些被索引文档的强大搜索功能。快速、分布式、水平扩展,支持实时文档存储和分析,支持数百台服务器和 PB 级索引数据。同时作为 Elastic stack (aka ELK) 的核心,提供了诸如 LogStash、Kibana 和更多的强大应用。
Kibana 是 Elasticsearch 中专门提供强有力的可视化查询Web应用程序。使用Kibana,能非常简单地为 Elasticsearch 中索引的数据创建查询、图表和仪表盘。
Elasticsearch开放了一个 REST API,你会发现许多文档示例是 HTTP 调用,你可以尝试使用 curl 或 postman 等工具。当然,这个 API 的客户端已经用许多不同的语言编写,包括.Net、Java、Python、Ruby和JavaScript等。
Logstash是一个具备实时处理能力的开源的数据收集引擎。可以动态地从不同的来源收集数据,将数据处理(过滤、变形)过之后统一输出到某个特定地址,为将来更多样化的数据分析做准备。
如果你想阅读更多,Elasticsearch 官方网站 可能是最好的地方。
注意:文章可能比较长,如果对Elasticsearch安装以及了解的,可以直接略过,看ASP.NET Core和Nlog部分,本文所有linux命令均在root用户下操作。
Java环境安装
懒人一键安装
1 | yum install java* |
查看JDK版本信息
1 | java -version |
Elasticsearch文档
安装
官方网站有很多安装方式,我这里采用的rpm安装,大家可以按照自己习惯的方式进行安装即可,下载地址。
1 2 3 4 5 6 7 8 9 10 | //进入local目录 cd /usr/local //创建elasticsearch文件夹 mkdir elasticsearch //进入elasticsearch文件夹 cd elasticsearch //开始下载 wget https: //artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.0.rpm //开始安装 rpm -ivh elasticsearch-5.5.0.rpm |
配置
1 2 3 4 5 6 | //查找安装目录 whereis elasticsearch //进入安装目录 cd /etc/elasticsearch //编辑配置文件 vi elasticsearch.yml |
主要配置Network.host(本机ip)和http.port(默认9200)(目前单节点模式,其他参数请参考官方文档)
启动服务
1 2 3 4 5 6 7 8 9 | //开启端口9200 firewall-cmd --add-port=9200/tcp --permanent //重新加载配置 firewall-cmd --reload //设置服务开机启动 systemctl enable elasticsearch //启动服务 systemctl start elasticsearch |
在浏览器打开http://192.168.30.128:9200,如下图所示表示启动成功了
Kibana文档
安装
1 2 3 4 5 6 | //进入elasticsearch目录 cd /usr/local/elasticsearch //下载Kibana rpm 64位包 wget https: //artifacts.elastic.co/downloads/kibana/kibana-5.5.0-x86_64.rpm //安装Kibana rmp -ivh kibana-5.5.0-x86_64.rpm |
配置
1 2 3 4 | //进入安装目录 cd /etc/kibana //编辑配置文件 vi kibana.yml |
设置端口号:5601,Host地址:"192.168.30.128" ,elasticsearch服务地址为:"http://192.168.30.128:9200"
启动服务
1 2 3 4 5 6 7 8 9 | //开启端口5601 firewall-cmd --add-port=5601/tcp --permanent //重新加载配置 firewall-cmd --reload //设置服务开机启动 systemctl enable kibana //启动服务 systemctl start kibana |
在浏览器打开http://192.168.30.128:5601,将进入到Kibana管理界面
LogStash文档
安装
1 2 3 4 5 6 | //进入elasticsearch目录 cd /usr/local/elasticsearch //下载logstash rpm包 wget https: //artifacts.elastic.co/downloads/logstash/logstash-5.5.0.rpm //安装rpm包 rpm -ivh logstash-5.5.0.rpm |
配置
1 2 3 4 5 6 | //进入安装目录 cd /etc/logstash //进入conf.d目录 cd conf.d //新增配置信息 vi nlog.conf |
input:采用TCP监控本机8001端口的消息
filter:使用grok 插件,自定义消息格式,推荐使用grokdebug在线进行调试
output:使用elasticsearch作为数据存储
注意:官方有非常丰富的插件进行消息处理,具体可以查看官方文档。
启动服务
1 2 3 4 5 6 7 8 9 | //开启端口8001 firewall-cmd --add-port=8001/tcp --permanent //重载配置 firewall-cmd --reload //设置开机启动 systemctl enable logstash //启动logstash systemctl start logstash |
ASP.ENT Core结合Nlog进行日志记录
下面是本文介绍的重点内容了,通过Nlog记录日志,将消息发送到logstash,logstash将转换后的消息存储到elasticsearch,并供在kibana中查询使用。
创建ASP.NET Core项目
本文通过VS2017创建的.NETCore 1.1 项目 Elasticsearch.QuickStart
通过Nuget安装Nlog依赖包
NLog.Web.AspNetCore
Nlog.Extensions.Logging (pre版本)
在Startup.cs添加Nlog服务
新增Nlog配置(Web根目录)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <?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= "Warn" internalLogFile= "internal-nlog.txt" > <extensions> <!--enable NLog.Web for ASP.NET Core--> <add assembly= "NLog.Web.AspNetCore" /> </extensions> <!-- define various log targets --> <!--定义日志文件目录--> <variable name= "logDirectory" value= "${basedir}/logs/${shortdate}" /> <variable name= "nodeName" value= "node1" /> <targets async= "true" > <!-- 全部日志target --> <target xsi:type= "File" name= "allfile" fileName= "${logDirectory}/nlog-all/${shortdate}.log" layout= "#node1#${longdate}#${logger}#${uppercase:${level}}#${callsite}#${callsite-linenumber}#${aspnet-request-url}#${aspnet-request-method}#${aspnet-mvc-controller}#${aspnet-mvc-action}#${message}#${exception:format=ToString}#" keepFileOpen= "false" /> <!-- 本地文件日志target --> <target xsi:type= "File" name= "ownLog-file" fileName= "${logDirectory}/nlog-${level}/${shortdate}.log" layout= "#${longdate}#${nodeName}#${logger}#${uppercase:${level}}#${callsite}#${callsite-linenumber}#${aspnet-request-url}#${aspnet-request-method}#${aspnet-mvc-controller}#${aspnet-mvc-action}#${message}#${exception:format=ToString}#" keepFileOpen= "false" /> <!-- Tcp日志target --> <target xsi:type= "Network" name= "ownLog-tcp" keepConnection= "false" address = "tcp://192.168.30.128:8001" layout= "#${longdate}#${nodeName}#${logger}#${uppercase:${level}}#${callsite}#${callsite-linenumber}#${aspnet-request-url}#${aspnet-request-method}#${aspnet-mvc-controller}#${aspnet-mvc-action}#${message}#${exception:format=ToString}#" /> <!--grok 规则--> <!--%#{DATA:request_time}#%{DATA:node_name}#%{DATA:class_name}#%{DATA:log_level}#%{DATA:call_site}#%{DATA:line_number}#%{DATA:request_url}#%{DATA:request_method}#%{DATA:container_name}#%{DATA:action_name}#%{DATA:log_info}#%{DATA:exception_msg}#--> <!--空白--> <target xsi:type= "Null" name= "blackhole" /> </targets> <!--日志级别 Trace -》Debug-》 Info -》Warn-》 Error-》 Fatal--> <!--日志规则--> <rules> <!--全部日志, 包括Microsoft日志--> <logger name= "*" minlevel= "Trace" writeTo= "allfile" /> <!--自定义日志,排除Microsoft日志--> <logger name= "Microsoft.*" minlevel= "Trace" writeTo= "blackhole" final= "true" /> <logger name= "*" minlevel= "Debug" writeTo= "ownLog-file" /> <logger name= "*" minlevel= "Info" writeTo= "ownLog-tcp" /> </rules> </nlog> |
注意:Tcp target中的address指向在logstash中监听的地址,在注释中也给出来了grok的模板信息。
测试Nlog日志记录
在Kibana中查看最终效果
总结
本文只是一个示例教程,希望能起到一个抛砖引玉的作用,详细功能需要大家参考官方文档。Elasticsearch,Kibana,logstash功能非常强大,我也是刚刚接触到,如果有不对的地方,还望大家多多包涵和指正。如果这篇文档对大家有帮助,请点一个赞,谢谢了。
参考
1:LogStash+ElasticSearch简单使用(CentOS)
2:使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据
3:Elastic Stack and Product Documentation
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?