最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.Net?Core3.0?WebApi?項目框架搭建之使用Serilog替換掉Log4j

 更新時間:2022年02月08日 16:18:45   作者:HuTiger  
Serilog 是一個用于.NET應(yīng)用程序的日志記錄開源庫,配置簡單,接口干凈,并可運行在最新的.NET平臺上,這篇文章主要介紹了.Net?Core3.0?WebApi?項目框架搭建之使用Serilog替換掉Log4j,需要的朋友可以參考下

為什么使用Serilog

Serilog 是一個用于.NET應(yīng)用程序的日志記錄開源庫,配置簡單,接口干凈,并可運行在最新的.NET平臺上,與其他日志庫不同, Serilog 是以功能強大的結(jié)構(gòu)化事件數(shù)據(jù)為基礎(chǔ)構(gòu)建的, 支持將日志輸出到控制臺、文件、數(shù)據(jù)庫和其它更多的方式,支持參數(shù)化日志模板,非常靈活。

之前我們項目使用的是Log4j來記錄用戶日志的,在開發(fā)的過程中,慢慢的發(fā)現(xiàn)Log4j好像并不能滿足我們的需求,比如結(jié)構(gòu)化,日志分析等,于是決定使用serilog來替換掉Log4j,在使用的過程中發(fā)現(xiàn)Serilog還是很強大的。

刪除原有的Log4j

1.卸載log4j包

2.刪除log4j文件夾

3.刪除startup的代碼

4.將log4j相關(guān)的代碼刪除

安裝Serilog包

nuget安裝以下幾個包

配置Serilog

編輯Appsetting.json

"Serilog": {
    "MinimumLevel": {
      "Default": "Debug", //最小日志記錄級別
      "Override": { //系統(tǒng)日志最小記錄級別
        "Default": "Warning",
        "System": "Warning",
        "Microsoft": "Warning"
      }
    },
    "WriteTo": [
      { "Name": "Console" }//輸出到控制臺
    ]
  },

program.cs將系統(tǒng)的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" //按天記錄
              }
            }
          ]
        }
      }
      ]

啟動項目測試

生成了日志文件

輸出到了數(shù)據(jù)庫

配置Serilog輸出到數(shù)據(jù)庫

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", //數(shù)據(jù)庫所有者,默認(rèn)dbo
                "tableName": "Logs", // 記錄日志的表名 
                "autoCreateSqlTable": true, // 是否自動創(chuàng)建表
                "restrictedToMinimumLevel": "Information", // 記錄日志的最小level 
                "batchPostingLimit": 100, //單次批量處理中提交的最大日志數(shù)量
                "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");

啟動項目,測試接口,數(shù)據(jù)庫已經(jīng)插入數(shù)據(jù)。

配置Serilog輸出到Seq

Seq組件,通過網(wǎng)頁UI的形式將日志展現(xiàn)出來,內(nèi)容更加多樣化,并賦予了更多功能日志搜索。

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

本地開發(fā)情形下是免費使用的,如果需要在生產(chǎn)環(huán)境中使用,需要商業(yè)許可(你懂的,money).在目前的版本中,4.2是只能夠在windows下跑,也就是說我們?nèi)绻窃趙indows下開發(fā),在測試時可以借助這個方便的查看日志信息,按照給定的安裝步驟完成安裝。

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

appsetting.json配置輸出到seq

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

啟動項目,測試接口,可以通過頁面看到數(shù)據(jù)。

全局使用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);
        }

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

然后直接代碼里用就行了

到此這篇關(guān)于.Net Core3.0 WebApi 項目框架搭建之使用Serilog替換掉Log4j的文章就介紹到這了,更多相關(guān).Net Core3.0使用Serilog替換掉Log4j內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • asp.net中控制反轉(zhuǎn)的理解(文字+代碼)

    asp.net中控制反轉(zhuǎn)的理解(文字+代碼)

    控制反轉(zhuǎn),從字面意思來看, 就是控制權(quán)由被動變主動又變?yōu)楸粍?,或被動變主動又變?yōu)楸粍?。從這個角度來說,IOC就變得非常容易理解
    2014-09-09
  • asp.net core 使用 TestServer 來做集成測試的方法

    asp.net core 使用 TestServer 來做集成測試的方法

    這篇文章主要介紹了asp.net core 使用 TestServer 來做集成測試,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • asp.net中ViewState的用法詳解

    asp.net中ViewState的用法詳解

    本文給大家介紹asp.net中viewstate的用法,涉及到viewstate的原理、用法、與session的對比等方面的知識,對viewstate用法感興趣的朋友一起看看吧
    2015-10-10
  • asp.net使用AJAX實現(xiàn)無刷新分頁

    asp.net使用AJAX實現(xiàn)無刷新分頁

    AJAX(Asynchronous JavaScript and XML)是一種進行頁面局部異步刷新的技術(shù)。用AJAX向服務(wù)器發(fā)送請求和獲得服務(wù)器返回的數(shù)據(jù)并且更新到界面中,不是整個頁面刷新,而是在頁面中使用Js創(chuàng)建XMLHTTPRequest對象來向服務(wù)器發(fā)出請求以及獲得返回的數(shù)據(jù)。
    2014-11-11
  • ASP.net?core使用Autofac實現(xiàn)泛型依賴注入

    ASP.net?core使用Autofac實現(xiàn)泛型依賴注入

    這篇文章主要介紹了ASP.net?core使用Autofac實現(xiàn)泛型依賴注入的方式學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Visual Studio 2017如何用正則修改部分內(nèi)容詳解

    Visual Studio 2017如何用正則修改部分內(nèi)容詳解

    這篇文章主要給大家介紹了關(guān)于Visual Studio 2017如何用正則修改部分內(nèi)容的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • GridView分頁的實現(xiàn)以及自定義分頁樣式功能實例

    GridView分頁的實現(xiàn)以及自定義分頁樣式功能實例

    本文為大家詳細介紹下GridView實現(xiàn)分頁并自定義的分頁樣式,具體示例代碼如下,有想學(xué)習(xí)的朋友可以參考下哈,希望對大家有所幫助
    2013-07-07
  • ASP.net WebAPI跨域調(diào)用問題的解決方法

    ASP.net WebAPI跨域調(diào)用問題的解決方法

    在做Web開發(fā)中,常常會遇到跨域的問題,到目前為止,已經(jīng)有非常多的跨域解決方案。下面這篇文章主要給大家介紹了關(guān)于ASP.net WebAPI跨域調(diào)用問題的解決方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2018-03-03
  • asp.net Repeater取得CheckBox選中的某行某個值

    asp.net Repeater取得CheckBox選中的某行某個值

    Repeater取得CheckBox選中的某行某個值的實現(xiàn)代碼
    2008-07-07
  • 在.net core中實現(xiàn)字段和屬性注入的示例代碼

    在.net core中實現(xiàn)字段和屬性注入的示例代碼

    這篇文章主要介紹了在.net core中實現(xiàn)字段和屬性注入的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

鄯善县| 苗栗县| 红河县| 南投市| 襄城县| 陆川县| 江北区| 台南市| 宁德市| 博客| 保德县| 富锦市| 鹤峰县| 盐池县| 上犹县| 剑河县| 儋州市| 库尔勒市| 迁安市| 哈密市| 遂宁市| 慈利县| 松潘县| 太康县| 子长县| 沙河市| 东乡族自治县| 五华县| 湘乡市| 柳州市| 习水县| 上杭县| 阿克陶县| 丹寨县| 湖州市| 吴忠市| 潢川县| 怀宁县| 浪卡子县| 南平市| 焉耆|