首頁 > 軟體

.Net Core3.0 WebApi 專案框架搭建之使用Serilog替換掉Log4j

2022-02-08 19:01:07

為什麼使用Serilog

Serilog 是一個用於.NET應用程式的紀錄檔記錄開源庫,設定簡單,介面乾淨,並可執行在最新的.NET平臺上,與其他紀錄檔庫不同, Serilog 是以功能強大的結構化事件資料為基礎構建的, 支援將紀錄檔輸出到控制檯、檔案、資料庫和其它更多的方式,支援引數化紀錄檔模板,非常靈活。

之前我們專案使用的是Log4j來記錄使用者紀錄檔的,在開發的過程中,慢慢的發現Log4j好像並不能滿足我們的需求,比如結構化,紀錄檔分析等,於是決定使用serilog來替換掉Log4j,在使用的過程中發現Serilog還是很強大的。

刪除原有的Log4j

1.解除安裝log4j包

2.刪除log4j資料夾

3.刪除startup的程式碼

4.將log4j相關的程式碼刪除

安裝Serilog包

nuget安裝以下幾個包

設定Serilog

編輯Appsetting.json

"Serilog": {
    "MinimumLevel": {
      "Default": "Debug", //最小紀錄檔記錄級別
      "Override": { //系統紀錄檔最小記錄級別
        "Default": "Warning",
        "System": "Warning",
        "Microsoft": "Warning"
      }
    },
    "WriteTo": [
      { "Name": "Console" }//輸出到控制檯
    ]
  },

program.cs將系統的logger替換為serilog

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
              .UseServiceProviderFactory(new AutofacServiceProviderFactory()) //<--NOTE THIS
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>()
                      .UseSerilog((context, logger) =>//註冊Serilog
                      {
                          logger.ReadFrom.Configuration(context.Configuration);
                          logger.Enrich.FromLogContext();
                      });
        });

Test控制器注入logger,並修改LogTest方法。

private readonly ILogger<TestController> _logger;
        public TestController(ILogger<TestController> logger)
        {
           _logger = logger;
        }
 /// <summary>
        /// 測試紀錄檔
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult LogTest()
        {
            //_logger.Error(typeof(TestController), "這是錯誤紀錄檔", new Exception("123"));
            //_logger.Debug(typeof(TestController), "這是bug紀錄檔");
            //throw new System.IO.IOException();
            _logger.LogInformation("info 紀錄檔");
            _logger.LogDebug("debug 紀錄檔");
            _logger.LogError(new System.IO.IOException(), "io 錯誤");
            return Ok();
        }

可以看到紀錄檔輸出到了控制檯

設定Serilog輸出到檔案

appsetting.json增加設定

 "WriteTo": [
      { "Name": "Console" }, //輸出到控制檯
      {
        "Name": "Async", //Serilog.Sinks.Async
        "Args": {
          "configure": [
            {
              "Name": "File", //輸出檔案
              "Args": {
                "path": "log/log.txt",
                "outputTemplate": "{NewLine}Date:{Timestamp:yyyy-MM-dd HH:mm:ss.fff}{NewLine}LogLevel:{Level}{NewLine}Message:{Message}{NewLine}{Exception}",
                "rollingInterval": "3" //按天記錄
              }
            }
          ]
        }
      }
      ]

啟動專案測試

生成了紀錄檔檔案

輸出到了資料庫

設定Serilog輸出到資料庫

appsetting.json設定

{"Name": "Async", //Serilog.Sinks.Async
        "Args": {
          "configure": [
            {
              "Name": "File", //輸出檔案
              "Args": {
                "path": "log/log.txt",
                "outputTemplate": "{NewLine}Date:{Timestamp:yyyy-MM-dd HH:mm:ss.fff}{NewLine}LogLevel:{Level}{NewLine}Message:{Message}{NewLine}{Exception}",
                "rollingInterval": "3" //按天記錄
              }
            },
              "Name": "MSSqlServer", //輸出到sqlserver
                "connectionString": "Server=.;User Id=sa;Password=sa123;Database=ApiLog;MultipleActiveResultSets=true",
                "schemaName": "dbo", //資料庫所有者,預設dbo
                "tableName": "Logs", // 記錄紀錄檔的表名 
                "autoCreateSqlTable": true, // 是否自動建立表
                "restrictedToMinimumLevel": "Information", // 記錄紀錄檔的最小level 
                "batchPostingLimit": 100, //單次批次處理中提交的最大紀錄檔數量
                "period": "0.00:00:30", //進行批次提交的間隔
                "columnOptionsSection": {
                  "disableTriggers": true,
                  "clusteredColumnstoreIndex": false,
                  "primaryKeyColumnName": "Id",
                  "addStandardColumns": [ "LogEvent" ],
                  "removeStandardColumns": [ "MessageTemplate" ],
                  "additionalColumns": [ //自定義列
                    {
                      "ColumnName": "Ip",
                      "DataType": "varchar",
                      "DataLength": 20
                    },
                      "ColumnName": "UserName",
                      "DataLength": 30
                      "ColumnName": "UserId",
                      "DataLength": 50
                      "ColumnName": "LogType",
                      "DataType": "tinyint"
                      "ColumnName": "Parameter"
                      "ColumnName": "Result"
                    }

                  ],
                  "id": { "nonClusteredIndex": true },
                  "properties": {
                    "columnName": "Properties",
                    "excludeAdditionalProperties": true,
                    "dictionaryElementName": "dict",
                    "itemElementName": "item",
                    "omitDictionaryContainerElement": false,
                    "omitSequenceContainerElement": false,
                    "omitStructureContainerElement": false,
                    "omitElementIfEmpty": true,
                    "propertyElementName": "prop",
                    "rootElementName": "root",
                    "sequenceElementName": "seq",
                    "structureElementName": "struct",
                    "usePropertyKeyAsElementName": false
                  },
                  "timeStamp": {
                    "columnName": "Timestamp",
                    "convertToUtc": true
                  "logEvent": {
                    "excludeStandardColumns": true
                  "message": { "columnName": "message" },
                  "exception": { "columnName": "exception" }
                }
            }
          ]
        }
      }

Test控制器修改Aoptest方法,新增以下語句

_logger.LogInformation("ip:{IP},username{UserName},userid:{UserId}","127.0.0.1","admin","1");

啟動專案,測試介面,資料庫已經插入資料。

設定Serilog輸出到Seq

Seq元件,通過網頁UI的形式將紀錄檔展現出來,內容更加多樣化,並賦予了更多功能紀錄檔搜尋。

首先,安裝Seq元件,Seq下載地址:https://getseq.net/Download

本地開發情形下是免費使用的,如果需要在生產環境中使用,需要商業許可(你懂的,money).在目前的版本中,4.2是隻能夠在windows下跑,也就是說我們如果是在windows下開發,在測試時可以藉助這個方便的檢視紀錄檔資訊,按照給定的安裝步驟完成安裝。

安裝完成之後,瀏覽器輸出localhost:5341,會看到以下頁面

appsetting.json設定輸出到seq

 {
              "Name": "Seq", //輸出到seq
              "Args": {
                "serverUrl": "http://192.168.0.89:5341"
              }
            },

啟動專案,測試介面,可以通過頁面看到資料。

全域性使用Serilog記錄紀錄檔

在CustomExceptionMiddleware.cs直接這樣

public class CustomExceptionMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger<CustomExceptionMiddleware> _logger;
        public CustomExceptionMiddleware(RequestDelegate next, ILogger<CustomExceptionMiddleware> logger)
        {
            _next = next;
        }
        public async Task Invoke(HttpContext httpContext)
        {
            try
            {
                await _next(httpContext);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message, ex); // 紀錄檔記錄
                await HandleExceptionAsync(httpContext, ex.Message);
            }

GlobalExceptionsFilter中也一樣

 public class GlobalExceptionsFilter : IExceptionFilter
    {
        private readonly IHostEnvironment _env;
        private readonly ILogger<GlobalExceptionsFilter> _logger;
        public GlobalExceptionsFilter(IHostEnvironment env, ILogger<GlobalExceptionsFilter> logger)
        {
            _env = env;
            _logger = logger;
        }
        public void OnException(ExceptionContext context)
        {
            var json = new JsonErrorResponse();
            json.Message = context.Exception.Message;//錯誤資訊
            if (_env.IsDevelopment())
            {
                json.DevelopmentMessage = context.Exception.StackTrace;//堆疊資訊
            }
            context.Result = new InternalServerErrorObjectResult(json);
            _logger.LogError(context.Exception, context.Exception.Message);
        }

如果想在服務層或倉儲層用的話,安裝這個包

然後直接程式碼裡用就行了

到此這篇關於.Net Core3.0 WebApi 專案框架搭建之使用Serilog替換掉Log4j的文章就介紹到這了,更多相關.Net Core3.0使用Serilog替換掉Log4j內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com