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

为什么使用Serilog

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

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

删除原有的Log4j

1.卸载log4j包

2.删除log4j文件夹

3.删除startup的代码

4.将log4j相关的代码删除

安装Serilog包

nuget安装以下几个包

配置Serilog

编辑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" //按天记录
              }
            }
          ]
        }
      }
      ]

启动项目测试

生成了日志文件

输出到了数据库

配置Serilog输出到数据库

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

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

配置Serilog输出到Seq

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"
              }
            },

启动项目,测试接口,可以通过页面看到数据。

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

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

然后直接代码里用就行了

到此这篇关于.Net Core3.0 WebApi 项目框架搭建之使用Serilog替换掉Log4j的文章就介绍到这了,更多相关.Net Core3.0使用Serilog替换掉Log4j内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .NET Core3.0创建Worker Services的实现

    .NET CORE 3.0新增了Worker Services的新项目模板,可以编写长时间运行的后台服务,并且能轻松的部署成windows服务或linux守护程序.如果安装的vs2019是中文版本,Worker Services变成了辅助角色服务.Worker Services 咱也不知道怎么翻译成了这个名称,咱也不敢乱翻译,下文就保持原名称...,本文将会演示如何创建一个Worker Services项目,并且部署为windows服务或linux守护程序运行: 开始创建worker servi

  • .Net Core3.0 配置Configuration的实现

    准备 .NET core和.NET项目配置上有了很大的改变,支持的也更加丰富了比如命令行,环境变量,内存中.NET对象,设置文件等等..NET项目我们常常把配置信息放到webConfig 或者appConfig中.配置相关的源码https://github.com/aspnet/Extensions:如果打开源码项目如果遇到以下错误,未遇到直接跳过. 错误提示:error : The project file cannot be opened by the project system, bec

  • .NET Core3.0 日志 logging的实现

    多年的经验,日志记录是软件开发的重要组成部分.没有日志记录机制的系统不是完善的系统.在开发阶段可以通过debug附件进程进行交互调试,可以检测到一些问题,但是在上线之后,日志的记录起到至关重要的作用.它可使我们在系统出现问题之后,排查错误提供依据. .NET Core3.0内置多种日志记录程序,并且有第三方提供的日志记录程序框架如:log4net,NLog,Serilog,elmah.io等.后面会介绍前三种日志框架如何与.NETcore3.0结合起来进行使用. 内置日志记录提供程序 ASP.N

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

    为什么使用Serilog Serilog 是一个用于.NET应用程序的日志记录开源库,配置简单,接口干净,并可运行在最新的.NET平台上,与其他日志库不同, Serilog 是以功能强大的结构化事件数据为基础构建的, 支持将日志输出到控制台.文件.数据库和其它更多的方式,支持参数化日志模板,非常灵活. 之前我们项目使用的是Log4j来记录用户日志的,在开发的过程中,慢慢的发现Log4j好像并不能满足我们的需求,比如结构化,日志分析等,于是决定使用serilog来替换掉Log4j,在使用的过程中发

  • SpringBoot多模块项目框架搭建过程解析

    这篇文章主要介绍了SpringBoot多模块项目框架搭建过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 创建根项目,New Project 创建一个名为 sms-bomber 的 SpringBoot 新项目,打包为 JAR 的即可,这里只添加 Lombok 与 spring-boot-starter-web 依赖,这两个依赖会传递给所有子模块,删除创建完成的项目中的 .mvn\ src\ mvnw mvnw.cmd 创建启动模块,根目

  • React Native项目框架搭建的一些心得体会

    React Native 是Facebook于2015年4月开源的跨平台移动应用开发框架, 短短的一两年的发展就已经有很多家公司支持并采用此框架来搭建公司的移动端的应用, React Native使你能够在Javascript和React的基础上获得完全一致的开发体验,构建世界一流的原生APP. 项目框架与项目结构 1. 项目中使用的技术栈 react native.react hook.typescript.immer.tslint.jest等. 都是比较常见的,就不多做介绍了 2. 数据处理

  • 如何搭建新的WPF项目框架

    下面就WPF项目框架搭建步骤一步一步的分享给大家. 在WPF项目开发中最常用的开发模式无疑是MVVM模式,  MVVM模式开发的好处,在这里就不详细讨论, 还有 本文中所使用MVVMLight框架,为什么使用MVVM框架(1.框架较轻,2.学习成本低.3.适用大多数中小型项目,4.相对于微软的prism框架更容易上手)    下面开始 一步一步 搭建框架 第一步: 利用反射创建VM构造器 public class ViewModelFactory { private static Diction

  • python mysql项目实战及框架搭建过程

    前言 python+mysql.connector,demo实战 框架搭建 说实话,其实没有使用到框架,只是用了, python+mysql.connector模块 首先在开始虚拟环境: (vega-j-vI5SDr) (vega) D:\test\python-mysql\python-mysql\vega>pip install mysql.connector Processing c:\users\administrator\appdata\local\pip\cache\wheels\7

  • 搭建一个基础的Resty项目框架

    目录 1.RestFilter 2.Config 3.resources 4.编写一个Resource 一个Resty项目包含的部分(resty-route): 1. RestFilter 像其他web框架一样,Resty也需要一个入口,在web.xml里配置,和常规的Filter区别不大 <filter> <filter-name>RestyFilter</filter-name> <filter-class>cn.dreampie.route.Resty

  • vue2.x+webpack快速搭建前端项目框架详解

    一.本文将分享如何快速搭起基于webpack+vue的前端项目框架,利用vue的自己的脚手架工具vue-cli搭建起基本的环境配置,再通过npm包管理工具引入相应的依赖来完善项目的各种依赖框架.下面是具体实操. 二.基本命令操作. 1.在开发之前需要首先安装node.js,直接百度搜索或者在其中文官网也可以下载http://nodejs.cn/download/ 在装完node之后npm包管理工具也自动的安装好,安装完之后,在命令行输入node -v或者npm -v,出现版本号说明安装成功.如下

  • 基于mpvue搭建微信小程序项目框架的教程详解

    简介: mpvue框架对于从没有接触过小程序又要尝试小程序开发的人员来说,无疑是目前最好的选择.mpvue从底层支持 Vue.js 语法和构建工具体系,同时再结合相关UI组件库,便可以高效的实现小程序开发 前言: 本文讲述如何搭建完整的小程序项目框架,因为是第一次使用,有不完善的地方请大佬指正. 搭建内容包括: 1.使用scss语法:依赖插件sass-loader .node-sass 2.像vue一样使用路由:依赖插件 mpvue-entry 和 mpvue-router-patch 3.使用

  • vite+vue3.0+ts+element-plus快速搭建项目的实现

    vite 出了 2.x 版本,抱着学一学的心态决定出个简单的项目,结合 element-plus,以及将会成为每位前端必会的 typescript,实现了如下内容. vite是一个由原生 ESM 驱动的 Web 开发构建工具.在开发环境下基于浏览器原生 ES imports 开发,在生产环境下基于 Rollup 打包. vite 作用 快速的冷启动:不需要等待打包操作: 即时的热模块更新:替换性能和模块数量的解耦让更新飞起: 真正的按需编译:不再等待整个应用编译完成,这是一个巨大的改变. 使用的

  • vue3.0项目快速搭建的完整步骤记录

    目录 一.我们要确保vue/cli版本在4.5.0以上,才能更好的支持3.0 二.通过vue/cli3创建我们的第一个项目 Router CSS 预编译 ESLint 语法校验 运行项目 升级vue 三.vue3.0相比vue2.0改进和新特性 总结 如何搭建一个vue3.0基础项目? 一.我们要确保vue/cli版本在4.5.0以上,才能更好的支持3.0 //安装最新vue/cli yarn global add @vue/cli //或 npm install -g @vue/cli 用vu

随机推荐