ELK安裝好后,我們現在.net Core中使用一下,大體思路就是結合NLog日志組件將數據寫入ELK中,其它語言同理。
ELK的安裝還是有些復雜的,我們也可以在Docker中安裝ELK:docker run -it --rm -p 9200:9200 -p 5601:5601 --name esk nshou/elasticsearch-kibana
這條命令執行完成后,我們就在本地運行了elasticsearch和Kibana,沒有錯誤的話我們就可以通過localhost:5601直接訪問Kibana界面了:


這里我們可以看到在一個容器里運行了多個程序,這樣節省了資源,同樣增加了管理的復雜性,不建議在生產環境中這樣使用。
同樣我們也可以通過localhost:9200訪問elasticsearch,返回如下數據:

有了elasticsearch和kibana我們還需要logstash,我這里以阿里雲上安裝的logstash為例,首先進到目錄下,我們需要新增一個nlog.conf配置文件:

內容如下:

這里使用最簡單的配置(其實是復雜的配置我一時還沒看懂。。。),這里我們指定監聽端口8001,同時指定數據輸出到elasticsearch中,下面是它的IP和端口。
添加完配置文件后在logstash文件夾下通過:bin/logstash -f nlog.conf 運行當前配置。
elasticsearch和kibana正常運行就可以,這樣我么的ELK就算都運行起來了。
新建一個.net core API項目,通過Nuget安裝Nlog依賴包:


在Startup.cs添加Nlog服務

我們這里用到了一個配置文件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
