ELK安装好后,咱们如今.net Core中使用一下,大致思路就是结合NLog日志组件将数据写入ELK中,其它语言同理。html
ELK的安装仍是有些复杂的,咱们也能够在Docker中安装ELK:docker run -it --rm -p 9200:9200 -p 5601:5601 --name esk nshou/elasticsearch-kibananode
这条命令执行完成后,咱们就在本地运行了elasticsearch和Kibana,没有错误的话咱们就能够经过localhost:5601直接访问Kibana界面了:docker
这里咱们能够看到在一个容器里运行了多个程序,这样节省了资源,一样增长了管理的复杂性,不建议在生产环境中这样使用。api
一样咱们也能够经过localhost:9200访问elasticsearch,返回以下数据:架构
有了elasticsearch和kibana咱们还须要logstash,我这里以阿里云上安装的logstash为例,首先进到目录下,咱们须要新增一个nlog.conf配置文件:mvc
内容以下:async
这里使用最简单的配置(实际上是复杂的配置我一时还没看懂。。。),这里咱们指定监听端口8001,同时指定数据输出到elasticsearch中,下面是它的IP和端口。elasticsearch
添加完配置文件后在logstash文件夹下经过:bin/logstash -f nlog.conf 运行当前配置。tcp
elasticsearch和kibana正常运行就能够,这样我么的ELK就算都运行起来了。测试
咱们这里用到了一个配置文件nlog.conf,配置以下:
<?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://47.99.92.76: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>
注意点是下面这里咱们须要指定logstash的地址和端口:
而后咱们在默认的ValueController中使用以下:
public class ValuesController : Controller { private readonly ILogger _logger=LogManager.GetCurrentClassLogger(); // GET api/values [HttpGet] public IEnumerable<string> Get() { _logger.Info("这是一条测试日志信息"); _logger.Warn("这是一条测试日志信息Warn"); _logger.Error("这是一条测试日志信息Error"); return new string[] { "value1", "value2" }; } }
如何不出问题的话,F5以后数据已经被写入ELK,如图:
这里只是简单的展现如何在程序里集成ELK,公司里并非用的NLog日志组件,是架构组封装的日志组件,固然,方法原理都是同样的,经过logstash将日志数据输出到elasticsearch,经过kibana展现。
参考文章:
https://blog.csdn.net/quryktcs/article/details/71331718
https://www.cnblogs.com/piscesLoveCc/p/7230426.html