.Net?Core3.0?WebApi?項(xiàng)目框架搭建之使用Serilog替換掉Log4j
為什么使用Serilog
Serilog 是一個(gè)用于.NET應(yīng)用程序的日志記錄開源庫(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來記錄用戶日志的,在開發(fā)的過程中,慢慢的發(fā)現(xiàn)Log4j好像并不能滿足我們的需求,比如結(jié)構(gòu)化,日志分析等,于是決定使用serilog來替換掉Log4j,在使用的過程中發(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組件,通過網(wǎng)頁(yè)UI的形式將日志展現(xiàn)出來,內(nèi)容更加多樣化,并賦予了更多功能日志搜索。
首先,安裝Seq組件,Seq下載地址:https://getseq.net/Download
本地開發(fā)情形下是免費(fèi)使用的,如果需要在生產(chǎn)環(huán)境中使用,需要商業(yè)許可(你懂的,money).在目前的版本中,4.2是只能夠在windows下跑,也就是說我們?nèi)绻窃趙indows下開發(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è)試接口,可以通過頁(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ǔ)層用的話,安裝這個(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)文章
asp.net core 使用 TestServer 來做集成測(cè)試的方法
這篇文章主要介紹了asp.net core 使用 TestServer 來做集成測(cè)試,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
asp.net使用AJAX實(shí)現(xiàn)無刷新分頁(yè)
AJAX(Asynchronous JavaScript and XML)是一種進(jìn)行頁(yè)面局部異步刷新的技術(shù)。用AJAX向服務(wù)器發(fā)送請(qǐng)求和獲得服務(wù)器返回的數(shù)據(jù)并且更新到界面中,不是整個(gè)頁(yè)面刷新,而是在頁(yè)面中使用Js創(chuàng)建XMLHTTPRequest對(duì)象來向服務(wù)器發(fā)出請(qǐng)求以及獲得返回的數(shù)據(jù)。2014-11-11
ASP.net?core使用Autofac實(shí)現(xiàn)泛型依賴注入
這篇文章主要介紹了ASP.net?core使用Autofac實(shí)現(xiàn)泛型依賴注入的方式學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Visual Studio 2017如何用正則修改部分內(nèi)容詳解
這篇文章主要給大家介紹了關(guān)于Visual Studio 2017如何用正則修改部分內(nèi)容的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
GridView分頁(yè)的實(shí)現(xiàn)以及自定義分頁(yè)樣式功能實(shí)例
本文為大家詳細(xì)介紹下GridView實(shí)現(xiàn)分頁(yè)并自定義的分頁(yè)樣式,具體示例代碼如下,有想學(xué)習(xí)的朋友可以參考下哈,希望對(duì)大家有所幫助2013-07-07
ASP.net WebAPI跨域調(diào)用問題的解決方法
在做Web開發(fā)中,常常會(huì)遇到跨域的問題,到目前為止,已經(jīng)有非常多的跨域解決方案。下面這篇文章主要給大家介紹了關(guān)于ASP.net WebAPI跨域調(diào)用問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2018-03-03
asp.net Repeater取得CheckBox選中的某行某個(gè)值
Repeater取得CheckBox選中的某行某個(gè)值的實(shí)現(xiàn)代碼2008-07-07
在.net core中實(shí)現(xiàn)字段和屬性注入的示例代碼
這篇文章主要介紹了在.net core中實(shí)現(xiàn)字段和屬性注入的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

