為什麼是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/NanoFabricFX/Serilog.Sinks.TencentCloud 這個庫的位址在這,歡迎大家幫忙改進哈~~
大佬們看了有什麼建議歡迎評論提出(/ω\)