.NET下使用 Seq結構化日誌系統
前言
我們公司在日誌管理方面一直沒有統一,主要痛點有:
- 每個開發人員都是各用各的,存儲日誌的形式也是五花八門,如:本地文件,數據庫,Redis,MongoDB
- 由於公司訪問服務器要通過堡壘機,所以本機無法直連測試或生產環境。如果測試日誌是寫入本地文件,就需要開發人員只能登錄服務器上查看日誌,查看非常不方便。
綜合以上所述有三種選擇:
- 自己寫一個日誌系統
- 找一個現成的
- 不記錄日誌了
綜合考慮,第三點肯定是不靠譜的,第一點成本太高,公司本來就比較忙,那就只能去找一個現成的了…
Seq簡介
Seq是運行在一臺機器上的日誌服務器。您的應用程序通過像Serilog這樣的框架發送結構化事件:
Log.Information("Hello, {Name}!", Environment.UserName);
結構化日誌記錄保留了自定義的屬性值以及與每個事件關聯的文本。
這些信息通過網絡發送到Seq,Seq顯示它們並使其可搜索:
目前支持三種語言:.NET與NET Core,Java,Node.js,以及Python。
Seq主要功能:
豐富的事件數據 -以結構化形式記錄上文信息與應用程序事件,支持消息模板將文本數據與結構話數據無縫連接。下圖中所有屬性都是由使用者自定義的。
多種查詢方式 -支持以SQL表達式查詢,以及C#中的,==,!=,<,<=,內置StartsWith(),
EndsWith()
,IndexOf()
和Contains(),並支持文本全文檢索。
儀表盤 - 搜索框添加查詢語句也可以是SQL查詢,匹配到相應的數據後,使用右側的Add to dashboard創建對應的儀表盤
添加警報 -當檢測到警報情況時,可以通過郵件將情況通知到相關人員。單擊儀表板圖表上ALERTS選項卡下的+按鈕:
Seq缺點:
內存消耗較高,屬於那種有多少就吃多少,如果吃撐了,就又吐出來一部分返回給系統,真的是有點不要臉。
收費,非開源系統,所以免費版本功能會有閹割。
詳細介紹可查看官網文檔:https://docs.getseq.net/docs
.NET Core實踐
1.下載並安裝Seq服務器
2.打開安裝程序啟動安裝向導,一路下一步,完成後瀏覽器輸入http://localhost:5341/#/events,5341是Seq的默認端口。Seq是托管在Windows服務中,通過win+r輸入services.msc命令運行查看。
環境搭建完成後,下面我們看下如何在項目中應用:
1.新建一個項目,ASP.NET Core 或 MVC都可以
2.添加Nuget程序包:
- Seq.Extensions.Logging
- Autofac
- Autofac.Extensions.DependencyInjection
3.在appsettings.json添加一個"Seq"屬性:
{
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Seq": {
"ServerUrl": "http://localhost:5341/", //Seq本地環境地址.
"ApiKey": "fCT0LNqspu3kituQMb", //在Seq系統創建的項目名稱KEY值。可通過此KEY值檢索出項目下的所有日誌信息
"MinimumLevel": "Trace",
"LevelOverride": {
"Microsoft": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
}
}
4. 在你的Startup類的ConfigureServices()方法,調用AddSeq()上loggingBuilder提供AddLogging()。
services.AddLogging(loggingBuilder => { //loggingBuilder.AddSeq(); loggingBuilder.AddSeq(Configuration.GetSection("Seq")); });
5.配置依賴註入
public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddLogging(loggingBuilder => { /*此方法默認使用本地地址: 5341端口*/ //loggingBuilder.AddSeq(); /*加載Seq配置*/ loggingBuilder.AddSeq(Configuration.GetSection("Seq")); }); services.AddMvc(); /*這裏使用Autofac作為依賴註入*/ var containerBuilder = new ContainerBuilder(); /*註入Seq記錄日誌對象*/ containerBuilder.RegisterGeneric(typeof(Logger<>)).As(typeof(ILogger<>)).InstancePerMatchingLifetimeScope(); /*因為更改了默認的依賴註入框架,所以需要將其原來的對象填充值新的依賴框架中*/ containerBuilder.Populate(services); var container = containerBuilder.Build(); return new AutofacServiceProvider(container); }
6.將ILogger實例註入到控制器中,並寫入日誌
private ILogger<ValuesController> _logger; public ValuesController(ILogger<ValuesController> logger) { _logger = logger; } // GET api/values [HttpGet] public IEnumerable<string> Get() { _logger.LogInformation("{Projece}&{ModuleName} Get Test", "SeqExample", "Values"); return new string[] { "value1", "value2" }; }
7.運行結果
可以看到,我們通過消息模板,自定義了兩個屬性,Project和ModuleName。在實際使用中我們可以根據公司業務來建立統一的消息模板,對項目日誌分類管理並查看。
總結
由於現在我使用的是免費版的,在很多方面有限制,如:不能將本地改為公網地址(可通過反向代理解決),不支持郵件預警。
類似這種限制還有,但都不影響使用,作為日誌系統,免費版本的基礎功能已經足夠使用,並且查詢性能並不弱。誰讓.NET開源框架少了,比起自己寫一個這樣的系統,我已經很知足了!
Seq目前在國內用的公司很少,所以此文只是拋磚引玉,便於大家在選擇日誌框架方面可以多一個選擇,僅此而已。
.NET下使用 Seq結構化日誌系統