當前位置: 妍妍網 > 碼農

即時洞察:ASP.NET Core結合NLog構建ELK日誌分析平台

2024-02-23碼農

隨著微服務架構和容器化技術的廣泛套用,日誌管理成為了系統運維和故障排查的重要工具。為了高效收集、儲存、查詢和分析應用程式的日誌資訊,許多企業選擇了ELK(Elasticsearch、Logstash和Kibana)這一強大的日誌分析平台。本文將介紹如何在ASP.NET Core應用程式中結合NLog日誌框架,搭建ELK即時日誌分析平台,以實作日誌的集中管理、即時搜尋和視覺化分析。

一、環境準備

在開始之前,確保已安裝以下元件:

  • Elasticsearch:用於儲存和索引日誌數據。

  • Logstash:用於日誌的收集、解析和轉換。

  • Kibana:用於視覺化和分析儲存在Elasticsearch中的日誌數據。

  • ASP.NET Core:用於構建Web應用程式。

  • NLog:用於ASP.NET Core應用程式的日誌記錄。

  • 二、配置NLog

    在ASP.NET Core計畫中,首先安裝NLog的NuGet包。然後,在計畫根目錄下建立或修改 NLog.config 配置檔,添加以下配置:

    <?xml version="1.0" encoding="utf-8" ?>
    <nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
    autoReload="true"
    throwExceptions="false"
    internalLogLevel="Info"internalLogFile="C:\temp\nlog-internal.log">

    <targets>
    <targetxsi:type="AsyncWrapper"name="AsyncFile"overflowAction="Discard">
    <targetxsi:type="File"name="File"fileName="C:\logs\app-${shortdate}.log"
    layout="${longdate} ${level} ${message} ${exception} ${newline}" />

    </target>
    <targetxsi:type="Logstash"name="Logstash">
    <connectionString>http://localhost:5000</connectionString>
    <layoutxsi:type="JsonLayout">
    <attributename="timestamp"layout="${date:format=o}" />
    <attributename="level"layout="${level}" />
    <attributename="message"layout="${message}" />
    <attributename="exception"layout="${exception}" />
    </layout>
    </target>
    </targets>
    <rules>
    <loggername="*"minlevel="Debug"writeTo="AsyncFile,Logstash" />
    </rules>
    </nlog>

    在上面的配置中,我們定義了兩個目標(Target): AsyncFile Logstash AsyncFile 將日誌記錄到本地檔,而 Logstash 則將日誌發送到Logstash進行進一步處理。

    三、配置Logstash

    Logstash的配置檔通常位於 /etc/logstash/conf.d/ 目錄下,建立或編輯一個配置檔,如 aspnetcore.conf ,添加以下內容:

    input {
    http {
    host => "localhost"
    port => 5000
    codec => json_lines
    }
    }
    filter {
    date {
    match => ["timestamp", "ISO8601"]
    }
    }
    output {
    elasticsearch {
    hosts => ["localhost:9200"]
    index => "aspnetcore-logs-%{+YYYY.MM.dd}"
    }
    }

    上述配置中,Logstash透過HTTP輸入外掛程式接收NLog發送的JSON格式日誌,使用日期過濾器解析日誌中的時間戳,並將處理後的日誌輸出到Elasticsearch中。

    四、在ASP.NET Core中使用NLog

    在ASP.NET Core計畫中,透過依賴註入配置NLog。在 Startup.cs ConfigureServices 方法中註冊NLog服務:

    publicvoidConfigureServices(IServiceCollection services)
    {
    services.AddNLog(); // 註冊NLog服務
    // ...
    }

    Program.cs 中配置NLog作為日誌工廠:

    public classProgram
    {
    publicstaticvoidMain(string[] args)
    {
    var logger = NLog.Web.NLogBuilder.ConfigureNLog("NLog.config").GetCurrent classLogger();
    try
    {
    logger.Info("Starting web host");
    CreateHostBuilder(args).Build().Run();
    }
    catch (Exception