1. 程式人生 > 實用技巧 >.netcore3.1使用ELK日誌中心(使用NLog資料傳輸)

.netcore3.1使用ELK日誌中心(使用NLog資料傳輸)

1、ELK部署

ELK是elasticsearch、kibana、Logstash組合而成的整套解決方案,前面我們使用skywalking時候已經部署好elasticsearch(參見上一篇隨筆),接下來只需要安裝Logstash和kibana即可

1.1、安裝kibana

前面使用的elasticsearch是7.5.0版本,這裡kibana選擇相同版本:

執行:

docker run -d --restart=always --name kibana -e ELASTICSEARCH_URL=http://192.168.56.10:9200 -p 5601:5601 kibana:7.5.0

瀏覽器訪問:

進入容器檢視配置檔案:

docker exec -it kibana /bin/bash

將配置檔案中的http://elasticsearch:9200改為http://192.168.56.10:9200

重啟容器:

docker restart  kibana

還是出現問題則稍等1分鐘,重試,頁面正常載入:

1.2、安裝Logstash

同樣選擇7.5.0版本:

sudo docker pull logstash:7.5.0

1.2.1、啟動

docker run -d --name=logstash -p 5044:5044 logstash:7.5.0

檢視日誌:

docker logs -f logstash

進入容器

docker exec -it logstash /bin/bash

修改配置檔案:

vi config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.56.10:9200" ]
View Code
vi pipeline/logstash.conf
input {
  tcp {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
  }
}

output {
  elasticsearch {
    hosts => "192.168.56.10:9200"
    index => "sample"
  }
  stdout {
    codec => rubydebug
  }
}
View Code

重啟:

docker restart logstash

2、NetCore 使用 ELK

2.1、新增NLog、NLog.Web.AspNetCore nuget包

2.2、根目錄新增配置檔案nlog.config

<?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.56.10:5044"
                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>
View Code

2.3、修改Program

在最後增加配置

ConfigureLogging(logging =>
{
    logging.ClearProviders();
    logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
}).UseNLog();

2.4、修改Startup

var currentClassLogger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
services.AddSingleton(currentClassLogger);

2.5、寫入測試(介面必須訪問幾遍,不然下面Kibana面板上無資料)

public class HealthCheckController : ControllerBase
    {
        private readonly ILogger<HealthCheckController> _logger;

        public HealthCheckController(ILogger<HealthCheckController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IActionResult GetHealthCheck()
        {
            _logger.LogInformation("這是一條測試訊息Information");

            _logger.LogError("這是一條測試訊息Erro");

            _logger.LogDebug("這是一條測試訊息Debug");

            return Ok("連線正常");
        }
    }
View Code

3、Kibana檢視資料

先看結果:

3.1、首先建立索引模板:

Logstatsh配置檔案logstash.conf中配置的output屬性:

Index patterns這裡同樣輸入sample*

其他輸入專案前還沒搞清楚是幹嘛的,反正是可選項,直接下一步,完成建立即可。

3.2、根據索引模板檢視資料

首頁即會提示建立,或者點選最左上角圖示到主頁,再點選

配置頁,輸入sample*,直接下一步即可(全部按預設建立,顯示所有欄位即可)

3.3、點選Discover

可以看到上面寫入的日誌記錄了

到這裡,基本的日誌寫入和呈現就完成了。

參考:

https://blog.csdn.net/xiaozm1223/article/details/89475003

https://www.cnblogs.com/chongyao/p/14098197.html

https://www.cnblogs.com/Leo_wl/p/11796634.html