.Net?Core3.0?WebApi?項(xiàng)目框架搭建之使用Serilog替換掉Log4j
為什么使用Serilog
Serilog 是一個(gè)用于.NET應(yīng)用程序的日志記錄開(kāi)源庫(kù),配置簡(jiǎn)單,接口干凈,并可運(yùn)行在最新的.NET平臺(tái)上,與其他日志庫(kù)不同, Serilog 是以功能強(qiáng)大的結(jié)構(gòu)化事件數(shù)據(jù)為基礎(chǔ)構(gòu)建的, 支持將日志輸出到控制臺(tái)、文件、數(shù)據(jù)庫(kù)和其它更多的方式,支持參數(shù)化日志模板,非常靈活。
之前我們項(xiàng)目使用的是Log4j來(lái)記錄用戶(hù)日志的,在開(kāi)發(fā)的過(guò)程中,慢慢的發(fā)現(xiàn)Log4j好像并不能滿(mǎn)足我們的需求,比如結(jié)構(gòu)化,日志分析等,于是決定使用serilog來(lái)替換掉Log4j,在使用的過(guò)程中發(fā)現(xiàn)Serilog還是很強(qiáng)大的。
刪除原有的Log4j
1.卸載log4j包
2.刪除log4j文件夾
3.刪除startup的代碼
4.將log4j相關(guān)的代碼刪除
安裝Serilog包
nuget安裝以下幾個(gè)包
配置Serilog
編輯Appsetting.json
"Serilog": { "MinimumLevel": { "Default": "Debug", //最小日志記錄級(jí)別 "Override": { //系統(tǒng)日志最小記錄級(jí)別 "Default": "Warning", "System": "Warning", "Microsoft": "Warning" } }, "WriteTo": [ { "Name": "Console" }//輸出到控制臺(tái) ] },
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) =>//注冊(cè)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> /// 測(cè)試日志 /// </summary> /// <returns></returns> [HttpGet] public IActionResult LogTest() { //_logger.Error(typeof(TestController), "這是錯(cuò)誤日志", 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 錯(cuò)誤"); return Ok(); }
可以看到日志輸出到了控制臺(tái)
配置Serilog輸出到文件
appsetting.json增加配置
"WriteTo": [ { "Name": "Console" }, //輸出到控制臺(tái) { "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" //按天記錄 } } ] } } ]
啟動(dòng)項(xiàng)目測(cè)試
生成了日志文件
輸出到了數(shù)據(jù)庫(kù)
配置Serilog輸出到數(shù)據(jù)庫(kù)
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ù)庫(kù)所有者,默認(rèn)dbo "tableName": "Logs", // 記錄日志的表名 "autoCreateSqlTable": true, // 是否自動(dòng)創(chuàng)建表 "restrictedToMinimumLevel": "Information", // 記錄日志的最小level "batchPostingLimit": 100, //單次批量處理中提交的最大日志數(shù)量 "period": "0.00:00:30", //進(jìn)行批量提交的間隔 "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方法,添加以下語(yǔ)句
_logger.LogInformation("ip:{IP},username{UserName},userid:{UserId}","127.0.0.1","admin","1");
啟動(dòng)項(xiàng)目,測(cè)試接口,數(shù)據(jù)庫(kù)已經(jīng)插入數(shù)據(jù)。
配置Serilog輸出到Seq
Seq組件,通過(guò)網(wǎng)頁(yè)UI的形式將日志展現(xiàn)出來(lái),內(nèi)容更加多樣化,并賦予了更多功能日志搜索。
首先,安裝Seq組件,Seq下載地址:https://getseq.net/Download
本地開(kāi)發(fā)情形下是免費(fèi)使用的,如果需要在生產(chǎn)環(huán)境中使用,需要商業(yè)許可(你懂的,money).在目前的版本中,4.2是只能夠在windows下跑,也就是說(shuō)我們?nèi)绻窃趙indows下開(kāi)發(fā),在測(cè)試時(shí)可以借助這個(gè)方便的查看日志信息,按照給定的安裝步驟完成安裝。
安裝完成之后,瀏覽器輸出localhost:5341,會(huì)看到以下頁(yè)面
appsetting.json配置輸出到seq
{ "Name": "Seq", //輸出到seq "Args": { "serverUrl": "http://192.168.0.89:5341" } },
啟動(dòng)項(xiàng)目,測(cè)試接口,可以通過(guò)頁(yè)面看到數(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;//錯(cuò)誤信息 if (_env.IsDevelopment()) { json.DevelopmentMessage = context.Exception.StackTrace;//堆棧信息 } context.Result = new InternalServerErrorObjectResult(json); _logger.LogError(context.Exception, context.Exception.Message); }
如果想在服務(wù)層或倉(cāng)儲(chǔ)層用的話(huà),安裝這個(gè)包
然后直接代碼里用就行了
到此這篇關(guān)于.Net Core3.0 WebApi 項(xiàng)目框架搭建之使用Serilog替換掉Log4j的文章就介紹到這了,更多相關(guān).Net Core3.0使用Serilog替換掉Log4j內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中使用SQLite數(shù)據(jù)庫(kù)的方法介紹
SQLite是一個(gè)開(kāi)源的輕量級(jí)的桌面型數(shù)據(jù)庫(kù),它將幾乎所有數(shù)據(jù)庫(kù)要素(包括定義、表、索引和數(shù)據(jù)本身)都保存在一個(gè)單一的文件中。SQLite用C編寫(xiě)實(shí)現(xiàn),它在內(nèi)存消耗、文件體積、操作性能、簡(jiǎn)單性方面都有不錯(cuò)的表現(xiàn)2012-01-01.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件
在本文里小編給大家分享了關(guān)于.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。2019-05-05IIS上部署你的ASP.NET?Core?Web?Api項(xiàng)目及Swagger(圖文)
本篇經(jīng)驗(yàn)將和大家介紹如何在IIS上部署ASP.NET?Core項(xiàng)目,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,希望為初學(xué).NET?CORE的童靴入門(mén)有所幫助2023-09-09在asp.NET 中使用SMTP發(fā)送郵件的實(shí)現(xiàn)代碼
本文簡(jiǎn)單介紹了SMTP協(xié)議(RFC2554)發(fā)送郵件的過(guò)程,并討論了在 .NET 中使用SMTP發(fā)送郵件由簡(jiǎn)到繁的三種不同方案、各自可能遇到的問(wèn)題及其解決辦法2011-05-05基于.NET中建構(gòu)子中傳遞子對(duì)象的對(duì)象詳解
本篇文章介紹了,基于.NET中建構(gòu)子中傳遞子對(duì)象的對(duì)象詳解。需要的朋友參考下2013-05-05ASP.NET Core 導(dǎo)入導(dǎo)出Excel xlsx 文件實(shí)例
本篇文章主要介紹了ASP.NET Core 導(dǎo)入導(dǎo)出Excel xlsx 文件,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-12