隨著微服務架構和容器化技術的廣泛套用,日誌管理成為了系統運維和故障排查的重要工具。為了高效收集、儲存、查詢和分析應用程式的日誌資訊,許多企業選擇了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