歡迎光臨
每天分享高質量文章

[翻譯] ASP.NET Core 利用 Docker、ElasticSearch、Kibana 來記錄日誌

一步一步指導您使用 ElasticSearch, Kibana, ASP.NET Core 2.1 和 Docker 來記錄日誌

在本教程中,我將向您展示如何啟動和執行 ElasticSearch,Kibana 和 ASP.NET Core 2.1

在開始之前,讓我們來看看 ElasticSearch,Kibana 和 Serilog 分別是什麼。

什麼是 ElasticSearch ?

簡單來說,ElasticSearch 是一個開源資料庫,非常適合索引日誌和分析資料。

什麼是 Kibana ?

Kibana 是開源的 ElasticSearch 的資料視覺化使用者介面。可以將 ElasticSearch 視為資料庫,將Kibana 視為 Web 使用者介面,您可以使用它在 ElasticSearch 中構建圖表和查詢資料。

什麼是 Serilog ?

Serilog 是 ASP.NET Core 的一個外掛,可以簡化日誌記錄。Serilog 有各種可用的接收器,例如,有純文字、SQL 和 ElasticSearch 接收器等等。

為什麼 ElasticSearch 如此受歡迎?

除了幾乎每個應用程式都需要日誌記錄這一事實之外,ElasticSearch 解決了許多問題並且做得非常好:

  • 它是免費和開源的
    免費。好吧,我承認是基本功能免費。如果您需要 Kibana 中的安全和警報功能,您可以購買 Kibana 的商業 X-pack 訂閱,或者可以找一些開源的替代品。
  • RESTful API
    ElasticSearch 有一個 RESTful 的 API。查詢結果以 JSON 格式傳回,這意味著結果是非常易用的。透過 RESTful API 查詢和插入資料意味著使用任何程式語言都可以輕鬆使用 ElasticSearch。
  • 易於查詢
    ElasticSearch 有一個內建的基於 Apache Lucene 的全文搜尋引擎。與其他資料庫相比,Lucene易於查詢。即使是非技術人員也可以編寫常見查詢。
  • 快 – 非常快
    查詢大型 SQL 資料庫很容易花費 10 或 20 秒。對於大型 ElasticSearch 資料庫上的類似查詢,在 10 毫秒內傳回結果是很常見的。
  • 可擴充套件
    它很容易擴充套件。再加上它是開源的, 這意味著您可以很容易控制您的錢包。
  • 易於安裝
    只需啟動包含 ElasticSearch 和 Kibana 容器的 docker compose 檔案,您就可以開始記錄和搜尋了。

為什麼我需要 ElasticSearch 和 Kibana ?

如果您曾經構建過應用程式,那麼你一定記錄過日誌。我們經常去記錄錯誤,但這些錯誤日誌儲存在伺服器某處的檔案檔案裡,經常會無法被訪問。ElasticSearch 使任何型別的日誌記錄變得簡單,易於訪問和搜尋。

ElasticSearch 令人難以置信的速度和簡單的查詢語言加上 Kibana 的圖形介面,構成了強大的組合。如果您還沒有使用 ElasticSearch 進行日誌記錄,我強烈建議您開始使用它。

資訊足夠了,讓我們開始 Coding 。

我將使用 Visual Studio Code,一個開源的跨平臺程式碼編輯器。出於本教程的目的,我將使用 Mac OSX,但您也可以使用 Ubuntu 或 Windows 10。

準備條件

要繼續下麵的步驟,請確保安裝了這些:

  • Docker
  • Visual Studio Code
  • .NET Core SDK 2.1.300 或更高版本 ( 下載 )

建立專案檔案夾

mkdir elastic-kibana
cd elastic-kibana

使用 .NET Core 命令列建立 MVC 專案

dotnet new mvc -n elastic-kibana -o src

在 Visual Studio Code 中開啟專案

cd elastic-kibana
code .

建立 docker compose 檔案

接下來,建立一個 docker compose 檔案。此檔案將一併啟動 ElasticSearch 和 Kibana 容器,無需為每個容器執行單獨的docker run命令。

mkdir docker
cd docker

建立一個名為 docker-compose.yml 的檔案:

version'3.1'

services:

  elasticsearch:
   image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
   container_name: elasticsearch
   ports:
    - "9200:9200"
   volumes:
    - elasticsearch-data:/usr/share/elasticsearch/data
   networks:
    - docker-network

  kibana:
   image: docker.elastic.co/kibana/kibana:6.2.4
   container_name: kibana
   ports:
    - "5601:5601"
   depends_on:
    - elasticsearch
   networks:
    - docker-network
  
networks:
  docker-network:
    driver: bridge

volumes:
  elasticsearch-data:

接下來,執行 docker compose 命令來啟動容器。

docker-compose up -d

第一次執行 docker-compose up 命令時,它將從 docker 倉庫下載 ElasticSearch 和 Kibana 所需的映象,因此它將花費幾分鐘的時間。

執行 docker-compose up 命令後,請檢查 ElasticSearch 和 Kibana 是否已經啟動。

ElasticSearch

開啟 http://localhost:9200 確認 ElasticSearch 已經啟動。

Kibana

開啟 http://localhost:5601 確認 Kibana 已經啟動。

加 Nuget 包到專案

我們將新增以下 Serilog 的包到專案。

Serilog
Serilog.Sinks.ElasticSearch
Serilog.Extensions.Logging

cd ..
cd elastic-kibana
dotnet add package Serilog
dotnet add package Serilog.Sinks.ElasticSearch
dotnet add package Serilog.Extensions.Logging
dotnet restore

新增一些配置資訊到 appsettings.json

新增預設的日誌設定以及 ElasticSearch 的 url 到 appsettings.json 檔案

{
  "Logging": {
    "LogLevel": {
        "Default""Information",
        "System""Information",
        "Microsoft""Information"
    }
  },
  "ElasticConfiguration": {
    "Uri""http://localhost:9200/"
  }
}

在 Startup.cs 中配置日誌功能

下一步,在 Startup.cs 中配置日誌功能

新增這些 using 陳述句:

using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Sinks.Elasticsearch;

然後,配置 Startup 的建構式以從 appsettings.json 載入 ElasticSearch 的 URL,並配置 ElasticSearch 的接收器。

public Startup(IConfiguration configuration, IHostingEnvironment hostingEnvironment)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(hostingEnvironment.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", reloadOnChange: true, optional: true)
        .AddEnvironmentVariables();

    Configuration = builder.Build();

    var elasticUri = Configuration["ElasticConfiguration:Uri"];

    Log.Logger = new LoggerConfiguration()
        .Enrich.FromLogContext()
        .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(elasticUri))
        {
            AutoRegisterTemplate = true,
        })
    .CreateLogger();
}

最後,在 Configure 方法中將 Serilog 新增到日誌工廠。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    
    
    loggerFactory.AddSerilog();
    
    
}

開始記錄日誌到 ElasticSearch

現在,透過在 Visual Studio Code 中點選 F5 或者命令列中執行 dotnet run 來執行 MVC 應用程式。

啟動 Kibana

由於我們在 Startup 類中配置了日誌記錄並將最小日誌級別設定為 Information,因此執行該應用程式會將一些事件記錄到 ElasticSearch 。

在 http://localhost:5601 開啟 Kibana,以便我們可以檢視日誌。

載入 Kibana 後,您將看到預設頁面。

在 Kibana 中建立索引樣式來顯示資料

Kibana 現在還不會顯示任何日誌。您必須先指定索引才能檢視記錄的資料。為此,請單擊導航中的 Management 連結,然後將列在頁面底部的 logstash 索引名稱複製到文字框中,如下所示,然後單擊下一步按鈕。或者,您可以使用*號萬用字元,例如 logstash-*

然後,透過選擇 @timestamp 指定時間過濾器欄位名稱,然後單擊 Create index pattern按鈕。

您現在可以透過單擊導航中的 Discover 連結來檢視日誌。

在 MVC Controller 中記錄自定義訊息

由於我們指定要記錄日誌級別為 Information 或更高階別的訊息,因此預設情況下會記錄大量資訊訊息。但是如果我們想記錄自己的訊息呢?值得慶幸的是,這很容易做到。接下來我將在 HomeController 中記錄一條訊息。

新增 using 陳述句:

using Microsoft.Extensions.Logging;

然後,使用建構式註入的方式來註入 ILogger 的實體。

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

最後,在 Index Action 中記錄一條訊息。

public IActionResult Index()
{
    _logger.LogInformation($"oh hai there! : {DateTime.UtcNow}");

    return View();
}

在 Kibana 中搜索

現在我們已經記錄了一條訊息,只需開啟 Kibana 並搜尋日誌訊息的文字即可。

您還可以將某一條日誌在單獨的視窗中開啟,以檢視各個欄位記錄的資訊。

我將展示一些基本的搜尋示例,來演示在 Kibana 中搜索的容易程度以及 ElasticSearch 的強大功能:

message:"oh hai there"
level:"Information"
fields.ActionName:"elastic_kibana.Controllers.HomeController.Index"
(message:"oh hai there" AND fields.ActionName:"elastic_kibana.Controllers.HomeController.Index")

記錄錯誤日誌到 ElasticSearch

一個典型的需求就是記錄錯誤訊息。使用 Serilog 這將變得非常簡單,如下所示。

try
{
    throw new Exception("oops. i haz cause error in UR codez.");
}
catch (Exception ex)
{
    _logger.LogError(ex, "ur code iz buggy.");
}

在 Kibana 中搜索錯誤日誌

在 Kibana 中找到錯誤日誌非常簡單,使用如下的搜尋條件就可以找到所有的錯誤日誌了。

level"Error"

我們來看看使用 Serilog 和 ElasticSearch 預設記錄的詳細資訊。

它看起來還不錯,但您會註意到異常細節被記錄為一個大大的字串。在此字串中搜索資訊仍會傳回結果,但如果根據特定欄位記錄資訊,我們可以執行更強大和特定的搜尋。值得慶幸的是,有一個名為 Serilog.Exceptions 的外掛可以幫助我們。

安裝 Serilog.Exceptions Nuget 包

安裝 Serilog.Exceptions Nuget 包:

dotnet add package Serilog.Exceptions
dotnet restore

接下來,在 Startup.cs 檔案中使用如下 using 陳述句

using Serilog.Exceptions;

然後,使用 Serilog.Exceptions 來豐富一下 Logger

public Startup(IConfiguration configuration, IHostingEnvironment hostingEnvironment)
{
    

    Log.Logger = new LoggerConfiguration()
        .Enrich.FromLogContext()
        .Enrich.WithExceptionDetails()
        .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(elasticUri))
        {
            AutoRegisterTemplate = true,
        })
    .CreateLogger();
}

最後,掃清一下,記錄一個新的錯誤,併在 Kibana 中搜索到它,檢視更結構化的錯誤日誌記錄。

降低日誌級別

您可能會發現 Information 級別日誌有點過於冗長,不符合您的口味。預設情況下,ASP.NET Core 將記錄 Kestrel 託管相關的日誌事件。這可能會非常嘈雜。排除掉它們的一種簡單方法是透過修改 appsettings 檔案,將 Microsoft 日誌級別設定為 Warning 。
或者, 您可以透過將 Default 和 System 的最小日誌級別設定為 Error 來進一步限制日誌記錄, 如下所示。

  "Logging": {
    "LogLevel": {
        "Default""Error",
        "System""Error",
        "Microsoft""Warning"
    }
  }

尾聲

傳統的方法,日誌記錄需要大量的前期工作才能啟動和執行。因此,日誌記錄通常會被完全遺漏,或者寫入到難以訪問的伺服器上的某些模糊的文字檔案裡。

ElasticSearch 和 Kibana 改變了這一切。而 Docker 已經使 ElasticSearch 和 Kibana 的啟動和執行變得毫不費力。ElasticSearch 和 Kibana 提供的強大功能以及非常高的效能,再加上它是開源的,這真的令人印象非常深刻。

即使沒有像 Serilog 這樣的外掛,與傳統 ASP.NET 相比,ASP.NET Core 中的日誌記錄也變得更加容易,因此, 在建立可擴充套件的日誌記錄框架方面, 我對 .NET Core 團隊表示贊賞。Serilog 簡單地構建在此之上,並且擴充套件了功能,以使 .NET Core 開發人員的日誌記錄變得更簡單。

透過組合 Docker,ElasticSearch,Kibana,ASP.NET Core 和 Serilog ,您獲得了前所未有的便利性和功能,再也沒有理由不再將日誌記錄整合到應用程式中了。

下載原始碼

下載原始碼 : https://github.com/thecarlo/elastic-kibana-netcore-serilog

資源

Download .NET Core 2.1 SDK
ElasticSeach
Kibana
Serilog
Serilog.Sinks.ElasticSearch Nuget Package

已同步到看一看
贊(0)

分享創造快樂