使用 .NET 與 ELK Log集中與分析

引言

在現代應用程序開發中,日誌記錄是診斷、監控和分析系統運行狀態的重要工具。當應用程序規模擴大,涉及多個服務或節點時,傳統的日誌文件管理方式已無法滿足需求。ELK 堆疊(Elasticsearch、Logstash、Kibana)提供了強大的日誌集中收集、存儲和分析解決方案。本文將詳細介紹如何在 .NET 環境中,使用 ELK 堆疊實現日誌的集中化與分析。

認識 ELK 堆疊

ELK 堆疊由三個開源產品組成:

  • Elasticsearch:分佈式搜索和分析引擎,用於存儲和查詢日誌數據。
  • Logstash:數據處理管道工具,用於收集、處理和轉發日誌數據。
  • Kibana:數據視覺化平台,用於搜索、查看和分析存儲在 Elasticsearch 中的數據。

搭建 ELK 環境

以下是在 Windows 環境下安裝 ELK 堆疊的步驟。

安裝 Elasticsearch

  1. 下載 Elasticsearch:訪問 Elasticsearch 官方下載頁面,選擇適合的版本。

  2. 解壓文件:將下載的壓縮包解壓到指定目錄。

  3. 運行 Elasticsearch

    • 打開命令提示符,進入 bin 目錄。

    • 運行以下命令啟動服務:

      elasticsearch.bat
      
  4. 驗證安裝:在瀏覽器中訪問 http://localhost:9200,應顯示 Elasticsearch 的基本信息。

安裝 Logstash

  1. 下載 Logstash:訪問 Logstash 官方下載頁面

  2. 解壓文件:將下載的壓縮包解壓到指定目錄。

  3. 創建配置文件

    • 在 Logstash 目錄下創建一個名為 logstash.conf 的配置文件,內容如下:

      input {
        http {
          port => 5000
        }
      }
      
      output {
        elasticsearch {
          hosts => ["localhost:9200"]
          index => "logs-%{+YYYY.MM.dd}"
        }
        stdout { codec => rubydebug }
      }
      
  4. 運行 Logstash

    • 打開命令提示符,進入 bin 目錄。

    • 運行以下命令啟動 Logstash:

      logstash.bat -f path\to\logstash.conf
      

安裝 Kibana

  1. 下載 Kibana:訪問 Kibana 官方下載頁面

  2. 解壓文件:將下載的壓縮包解壓到指定目錄。

  3. 配置 Kibana

    • 編輯 config/kibana.yml 文件,確保 Elasticsearch 的地址配置正確:

      elasticsearch.hosts: ["http://localhost:9200"]
      
  4. 運行 Kibana

    • 打開命令提示符,進入 bin 目錄。

    • 運行以下命令啟動 Kibana:

      kibana.bat

  5. 驗證安裝:在瀏覽器中訪問 http://localhost:5601,應顯示 Kibana 的界面。

配置 .NET 應用程序進行日誌記錄

我們將使用 Serilog 作為日誌記錄框架,並使用 Serilog.Sinks.Elasticsearch 將日誌發送到 Elasticsearch。

使用 Serilog

創建 .NET 應用程序:

  1. 打開 Visual Studio,創建一個新的 .NET Core 控制台應用程序。

安裝 NuGet 套件:

  1. 右鍵點擊項目,選擇 管理 NuGet 套件
  2. 搜索並安裝以下套件:
    • Serilog
    • Serilog.Sinks.Elasticsearch
    • Serilog.Sinks.Console

配置 Serilog 輸出到 Elasticsearch

Program.cs 中:

using System;
using Serilog;

namespace ELKLoggingDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 配置 Serilog
            Log.Logger = new LoggerConfiguration()
                .Enrich.WithProperty("Application", "ELKLoggingDemo")
                .WriteTo.Console()
                .WriteTo.Elasticsearch(new Serilog.Sinks.Elasticsearch.ElasticsearchSinkOptions(new Uri("http://localhost:9200"))
                {
                    AutoRegisterTemplate = true,
                    IndexFormat = "logs-{0:yyyy.MM.dd}"
                })
                .CreateLogger();

            try
            {
                Log.Information("應用程序開始運行");
                // 模擬一些操作
                Log.Warning("這是一個警告信息");
                throw new Exception("模擬異常");
            }
            catch (Exception ex)
            {
                Log.Error(ex, "發生了異常");
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }
    }
}

說明:

  • Enrich.WithProperty:為日誌添加全局屬性,方便在 Kibana 中過濾。
  • WriteTo.Console():將日誌輸出到控制台。
  • WriteTo.Elasticsearch():配置 Elasticsearch 輸出,指定 Elasticsearch 的地址和索引格式。

測試日誌記錄

運行應用程序,您應能在控制台看到日誌輸出。同時,日誌也被發送到 Elasticsearch。

在 Kibana 中分析日誌

建立索引模式

  1. 打開 Kibana:在瀏覽器中訪問 http://localhost:5601
  2. 建立索引模式:
    • 導航到 Management -> Stack Management -> Index Patterns
    • 點擊 Create index pattern
    • Index pattern 中輸入 logs-*,點擊 Next step
    • 選擇時間字段(如果有),然後點擊 Create index pattern

使用 Discover 功能

  1. 導航到 Discover:
    • 在左側菜單中點擊 Discover
    • 選擇剛創建的索引模式 logs-*
  2. 查看日誌:
    • 您應能看到從 .NET 應用程序發送的日誌。
    • 可以使用搜索和過濾功能定位特定的日誌。

創建視覺化圖表

  1. 創建視覺化圖表:
    • 點擊 Visualize Library -> Create visualization
    • 選擇圖表類型(例如,柱狀圖、餅圖)。
  2. 配置數據源:
    • 選擇索引模式 logs-*
    • 配置聚合方式,例如按日誌級別統計數量。
  3. 保存視覺化圖表:
    • 配置完成後,點擊 Save,為視覺化圖表命名。

建立儀表板

  1. 創建儀表板:
    • 點擊 Dashboard -> Create dashboard
  2. 添加視覺化圖表:
    • 點擊 Add,選擇剛創建的視覺化圖表。
  3. 保存儀表板:
    • 點擊 Save,為儀表板命名。

結論

通過上述步驟,我們成功地在 .NET 應用程序中集成了 ELK 堆疊,實現了日誌的集中化收集和分析。這種方式有助於更好地監控應用程序的運行情況,快速定位和解決問題。

參考資源