.Net Core3.0 WebApi 项目框架搭建之使用Serilog替换掉Log4j

2022-04-16 22:53:37

为什么使用Serilog

Serilog 是一个用于.NET应用程序的日志记录开源库,配置简单,接口干净,并可运行在最新的.NET平台上,与其他日志库不同, Serilog 是以功能强大的结构化事件数据为基础构建的, 支持将日志输出到控制台、文件、数据库和其它更多的方式,支持参数化日志模板,非常灵活。

之前我们项目使用的是Log4j来记录用户日志的,在开发的过程中,慢慢的发现Log4j好像并不能满足我们的需求,比如结构化,日志分析等,于是决定使用serilog来替换掉Log4j,在使用的过程中发现Serilog还是很强大的。

删除原有的Log4j

1.卸载log4j包

2.删除log4j文件夹

3.删除startup的代码

t.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();        }

可以看到日志输出到了控制台

erties", "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");

启动项目,测试接口,数据库已经插入数据。

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);        }

如果想在服务层或仓储层用的话,安装这个包

.NetCore3.0WebApi项目框架搭建之使用Serilog替换掉Log4j

然后直接代码里用就行了

.NetCore3.0WebApi项目框架搭建之使用Serilog替换掉Log4j

.NetCore3.0WebApi项目框架搭建之使用Serilog替换掉Log4j

.NetCore3.0WebApi项目框架搭建之使用Serilog替换掉Log4j