<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Serilog 是一個用於.NET應用程式的紀錄檔記錄開源庫,設定簡單,介面乾淨,並可執行在最新的.NET平臺上,與其他紀錄檔庫不同, Serilog 是以功能強大的結構化事件資料為基礎構建的, 支援將紀錄檔輸出到控制檯、檔案、資料庫和其它更多的方式,支援引數化紀錄檔模板,非常靈活。
之前我們專案使用的是Log4j來記錄使用者紀錄檔的,在開發的過程中,慢慢的發現Log4j好像並不能滿足我們的需求,比如結構化,紀錄檔分析等,於是決定使用serilog來替換掉Log4j,在使用的過程中發現Serilog還是很強大的。
1.解除安裝log4j包
2.刪除log4j資料夾
3.刪除startup的程式碼
4.將log4j相關的程式碼刪除
nuget安裝以下幾個包
編輯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" //按天記錄 } } ] } } ]
啟動專案測試
生成了紀錄檔檔案
輸出到了資料庫
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");
啟動專案,測試介面,資料庫已經插入資料。
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" } },
啟動專案,測試介面,可以通過頁面看到資料。
在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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45