Serilog 是 ASP.NET Core 的一個插件,能夠簡化日誌記錄

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

原文: Logging with ElasticSearch, Kibana, ASP.NET Core and Dockerjavascript

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

在本教程中,我將向您展現如何啓動和運行 ElasticSearch,Kibana 和 ASP.NET Core 2.1css

在開始以前,讓咱們來看看 ElasticSearch,Kibana 和 Serilog 分別是什麼。html

什麼是 ElasticSearch ?

簡單來講,ElasticSearch 是一個開源數據庫,很是適合索引日誌和分析數據。java

什麼是 Kibana ?

Kibana 是開源的 ElasticSearch 的數據可視化用戶界面。能夠將 ElasticSearch 視爲數據庫,將Kibana 視爲 Web 用戶界面,您可使用它在 ElasticSearch 中構建圖表和查詢數據。nginx

什麼是 Serilog ?

Serilog 是 ASP.NET Core 的一個插件,能夠簡化日誌記錄。Serilog 有各類可用的接收器,例如,有純文本、SQL 和 ElasticSearch 接收器等等。git

爲何 ElasticSearch 如此受歡迎?

除了幾乎每一個應用程序都須要日誌記錄這一事實以外,ElasticSearch 解決了許多問題而且作得很是好:github

  • 它是免費和開源的
    免費。好吧,我認可是基本功能免費。若是您須要 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 使任何類型的日誌記錄變得簡單,易於訪問和搜索。docker

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

相關文章
相關標籤/搜索