1. 程式人生 > >ELK系列(二):.net core中使用ELK

ELK系列(二):.net core中使用ELK

正常 etc () 完成後 class -c tro 訪問 ret

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

ELK系列(二):.net core中使用ELK