1. 程式人生 > >.NET下使用 Seq結構化日誌系統

.NET下使用 Seq結構化日誌系統

eof 檢索 fig 直連 自定義 兩個 img 性能 collect

前言

我們公司在日誌管理方面一直沒有統一,主要痛點有:

  1. 每個開發人員都是各用各的,存儲日誌的形式也是五花八門,如:本地文件,數據庫,Redis,MongoDB
  2. 由於公司訪問服務器要通過堡壘機,所以本機無法直連測試或生產環境。如果測試日誌是寫入本地文件,就需要開發人員只能登錄服務器上查看日誌,查看非常不方便。

綜合以上所述有三種選擇:

      1. 自己寫一個日誌系統
      2. 找一個現成的
      3. 不記錄日誌了

綜合考慮,第三點肯定是不靠譜的,第一點成本太高,公司本來就比較忙,那就只能去找一個現成的了…

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缺點:

  1. 內存消耗較高,屬於那種有多少就吃多少,如果吃撐了,就又吐出來一部分返回給系統,真的是有點不要臉。
  2. 收費,非開源系統,所以免費版本功能會有閹割。

詳細介紹可查看官網文檔: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結構化日誌系統