為什麼是serilog?
Serilog是 .NET 中最著名的結構化日誌類庫。
基於日誌事件log events,而不是日誌訊息log message。
你可以將日誌事件格式化為控制檯的可讀文字或者可以將相同的事件格式化為JSON並將其傳送到遠端日誌伺服器。
應用程式中的日誌語句會建立LogEvent
物件,而連線到管道的接收器[sinks]會知道如何記錄它們。
這裡有一篇文章比較了.NET目前三種最常用的日誌元件,有興趣可以去看看。
nlog-vs-log4net-vs-serilog-comparing-net-logging
為什麼是騰訊雲日誌服務?
最普通的日誌記錄大概是直接把日誌寫入本地檔案進行記錄,但是在容器化,上雲的時代,把日誌記錄在雲端才是更好的方式。
Serilog有很多sink可以將日誌記錄推送到不同的地方儲存。最常見的有Elasticsearch,結合kibana展示日誌資料,但是通常需要我們額外搭建Elasticsearch服務和kibana服務。
騰訊雲有一個日誌服務,可以給我們提供儲存和索引功能,基本可以滿足我們日常的需要還不需要額外搭建服務。
日誌服務主要提供以下功能:
日誌採集:通過 LogListener、API 等方式從不同日誌採集端採集日誌至日誌服務。
日誌儲存:使用日誌服務儲存日誌資料。
日誌索引:開啟日誌索引對日誌進行查詢,可幫助使用者快速定位日誌問題。
日誌投遞:使用者可以將指定日誌投遞至其他雲產品中,滿足儲存或其他計算需求。如指定的 COS 儲存桶中,對日誌進行生命週期管理等,滿足日誌審計需求。
具體內容可檢視日誌服務產品文件
使用騰訊雲日誌服務
在日誌集管理裡面我們可以建立我們自己的日誌集,可以自定義日誌儲存時間。
同時新建一個日誌主題,這裡我們是屬於日誌投遞的功能,所以我們不需要開啟LogListener。
新建日誌主題之後若我們需要使用日誌服務的檢索功能的話,需要手動開啟,不然是無法檢索到已經投遞的日誌的喔~在日誌主題裡面的索引配置裡面開啟開關儲存即可。
好了,日誌主題新建完了,接下來我們要如何把日誌投遞到騰訊雲呢。
將日誌投遞到騰訊雲日誌服務
問題來了,serilog的sink裡面並沒有tencentCloud的庫,怎麼辦呢,那我們來造一個輪子吧。
在產品的API文件我們可以看到有這個上傳結構化日誌的介面
我們可以通過http請求講日誌上傳到騰訊雲,在github上面serilog的眾多sink中,有一個serilog.sink.http的庫,是使用http請求推送日誌的,我們down下來參考一下修改修改。
然後我就搞了個Serilog.Sinks.TencentCloud(/ω\)
使用方式也很簡單(/ω\)github上面readme上面有一個很簡陋的說明。
然後呢,引用這個庫,我們在asp.net core裡面把這個擴充套件加入serilog,最簡單的方法如下:
在入口main()函式中加入下面程式碼。
Log.Logger = new LoggerConfiguration()
.WriteTo.TencentCloud("請求域名(ap-guangzhou.cls.myqcloud.com)", "topic_id", "TencentCloud API Sercet Id", "TencentCloud API Sercet Key", restrictedToMinimumLevel: LogEventLevel.Warning)
.CreateLogger()
或者在IWebHostBuilder的UseSeriLog()中進行配置:
public static IWebHost BuildWebHostInternal(string[] args) =>
new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.ConfigureAppConfiguration((context, configuration) =>
{
configuration.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", true, true)
.AddEnvironmentVariables();
})
.UseSerilog((context, logger) =>
{
logger.Enrich.FromLogContext()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.WriteTo.TencentCloud("ap-guangzhou.cls.myqcloud.com", "", "", "", restrictedToMinimumLevel: LogEventLevel.Debug)
;
}
)
.Build();
也可以通過配置檔案進行配置,需要引用Serilog.Settings.Configuration這個擴充套件包,然後再配置檔案中加如如下配置
"Serilog": {
"Using": [ "Serilog.Sinks.TencentCloud" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "TencentCloud",
"Args": {
"requestBaseUri": "ap-guangzhou.cls.myqcloud.com",
"topicId": "",
"secretId": "",
"secretKey": ""
}
}
]
},
然後在IWebHostBuilder的UseSeriLog()中進行配置:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, configuration) =>
{
configuration.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", true, true)
.AddEnvironmentVariables();
})
.UseSerilog((context, logger) =>
{
logger.ReadFrom.Configuration(context.Configuration);
})
.UseStartup<Startup>();
配置完成後啟動應用程式日誌就會自動記錄並推送到騰訊雲日誌服務了。
檢索日誌集
開啟騰訊雲日誌服務,選擇日誌集點選檢索,前提得已經開啟索引配置喔。
我們可以看到已經把結構化的日誌資訊全都投遞到日誌服務了,
輸入關鍵字可以進行全文搜尋我們想要的日誌,比如我搜尋warning,和exception,即可檢索出warning級別和exception的日誌資訊
搞完
這樣就成功使用serilog將日誌推送到騰訊雲日誌服務啦(/ω\)
Serilog.Sinks.TencentCloud https://github.com/fanslead/Serilog.Sinks.TencentCloud 這個庫的地址在這,歡迎大家幫忙改進哈~~
大佬們看了有什麼建議歡迎評論提出(/ω\)