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

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就算都運行起來了。測試

 

 

新建一個.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

相關文章
相關標籤/搜索