如何在 Asp.Net Core 中将日志记录到 SQL Server

byteweaver
• 阅读 1763
译文链接:https://www.infoworld.com/art...

记录日志是应用程序的一个基本功能点,日志对于发现,排查,调试bug的时候特别有用,Serilog 是一个第三方开源的类库,它可以将日志结构化的输出到控制台,文件 以及 若干个其他类别的数据存储中。

本篇主要讨论如何通过 Serilog 将结构化的日志写入到 Sql Server 中,要想运行本篇中的例子,你需要安装一下 Visual Studio 2019。

安装 Serilog

要把 Serilog 用起来,需要通过 NuGet 去安装,有两种方式可以选择,要么使用 VS 中的 NuGet package manager 可视化界面,要么在 NuGet package manager console 命令行窗口中键入如下命令。


Install-Package Serilog
Install-Package Serilog.AspNetCore
Install-Package Serilog.Sinks.MSSqlServer
Install-Package Serilog.Settings.Configuration

初始化 Serilog

下面的代码展示了如何将 Serilog 添加到 ASP.NET Core 中,可以着重看一下使用 UseSerilog() 扩展方法将 Serilog 作为 ASP.NET Core 默认的日志框架。


public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                   .UseStartup<Startup>()
                   .UseSerilog()
                   .Build();

搭建一个测试 web程序

为了在应用程序中展示 Serilog 的用法,下面是完整的代码段,可以着重看一下我们是如何配置和构建 webhost 的。


    public class Program
    {
        public static void Main(string[] args)
        {
            IConfigurationRoot configuration = new
            ConfigurationBuilder().AddJsonFile("appsettings.json",
            optional: false, reloadOnChange: true).Build();
            Log.Logger = new LoggerConfiguration().ReadFrom.Configuration
            (configuration).CreateLogger();
            BuildWebHost(args).Run();
        }
        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSerilog()
                .Build();
    }

为了让 UseSerilog() 可用,记得要引用一下 Serilog 命名空间。


using Serilog;

配置数据库连接

当用 Visual Studio 创建好 ASP.NET Core 项目时,appsettings.json 文件默认就创建好了,这个文件很重要,后续的数据库连接串和其他的一些配置信息都会在这里配置,下面是完整的 appsettings.json 配置。


{
  "Serilog": {
    "MinimumLevel": "Information",
    "WriteTo": [
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": "Data Source=LAPTOP-ULJMOJQ5;Initial
           Catalog=Research;    
     User Id=joydip; Password=sa123#;",
          "tableName": "Log",
          "autoCreateSqlTable": true
        }
      }
    ]
  }
}

使用 SQL Server 创建日志表

应用程序会自动的生成table表,当然你也可以手工的在数据库中生成日志表,如果要这么做的话,可以使用下面的脚本。


   CREATE TABLE [Log] (
   [Id] int IDENTITY(1,1) NOT NULL,
   [Message] nvarchar(max) NULL,
   [MessageTemplate] nvarchar(max) NULL,
   [Level] nvarchar(max) NULL,
   [TimeStamp] datetimeoffset(7) NOT NULL,
   [Exception] nvarchar(max) NULL,
   [Properties] nvarchar(max) NULL
   CONSTRAINT [PK_Log]
     PRIMARY KEY CLUSTERED ([Id] ASC)
   )

当应用程序运行后,数据库会生成一张 Log 表,同时 ASP.NET Core 会将日志记录到该表中,下面展示了已经被记录到 log 表的日志信息。

如何在 Asp.Net Core 中将日志记录到 SQL Server

在 action 中记录日志

你可以使用 依赖注入(DI) 的方式将 log实例注入到 Controller 中,如下代码所示:


public class DefaultController : Controller
{
   private readonly ILogger<DefaultController> _logger;
   public DefaultController(ILogger<DefaultController> logger)
   {
      _logger = logger;
   }
}

下面的代码片段展示了如何利用 Serilog 在 Controller 下的 Action 中记录日志。


    public class DefaultController : Controller
    {
        private readonly ILogger<DefaultController> _logger;
        public DefaultController(ILogger<DefaultController> logger)
        {
            _logger = logger;
        }
        public IActionResult Index()
        {
            _logger.LogInformation("Hello World");
            return View();
        }
    }

虽然 Serilog 是独立于 .NET Core,并且它是以插件的形式完美的介入到 ASP.NET Core 生态系统中,让结构化的日志更加容易,方便的被记录,Serilog 可以利用几十种接收器将日志发送到不同的 target 中,这些 target 包括:文本文件,数据库,AWS,Azure 和 Google Could Service ,在这篇,我已经展示过了 Serilog 如何和 SQLServer 一起协作,我将会在后续的文章中讨论 Serilog 的更多高级特性。

更多高质量干货:参见我的 GitHub: dotnetfly
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
tomcat启动出现常量池中无效的字节标记异常
详细异常日志如下2020083110:52:30,285com.taobao.tomcat.container.context.pandora.PandoraManagerstartInternalINFO:Pandoracontainerstarted.2020083110:52:31,383org.
胖大海 胖大海
2年前
Nginx 配置文件
yum安装nginx配置文件目录server配置 /etc/nginx/conf.d/default.conflocation配置!(https://oscimg.oschina.net/oscnet/up52e3
Stella981 Stella981
3年前
Exceptionless
<divid"cnblogs\_post\_body"class"blogpostbodycnblogsmarkdown"<h1id"exceptionless.netcore开源日志框架"Exceptionless.NetCore开源日志框架</h1<blockquote<p作者:markjiang7m2<b
Wesley13 Wesley13
3年前
HTTP面试题(二):HTTP请求报文和响应报文格式
!(https://oscimg.oschina.net/oscnet/0406894fb1274bee91fc53c84c516576.jpg)看都看了还不点个赞!(https://oscimg.oschina.net/oscnet/095d444dc9a449ee85afd19b00fdf52b.png)!(h
Wesley13 Wesley13
3年前
MYSQL主从同步故障解决(主键重复)
MYSQL主从同步故障解决(主键重复)转载2010年04月05日18:52:00标签:mysql(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fso.csdn.net%2Fso%2Fsearch%2Fs.do%3Fq%
Stella981 Stella981
3年前
Comet OJ
题意https://www.cometoj.com/contest/52/problem/C?problem\_id2416(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cometoj.com%2Fcontest%2F52%2Fproblem%2FC%3Fprob
Stella981 Stella981
3年前
SpringBoot开发案例之整合Dubbo提供者(二)
!00.jpg(https://blog.52itstyle.com/usr/uploads/2017/07/1329278006.jpg)大家有没有注意到,上一篇中提供者,暴露接口的方式?混搭。springboot本身接口实现使用了注解的方式,而Dubbo暴露接口使用的是配置文件的实现方式,即如下:代码importorg.s
Easter79 Easter79
3年前
SpringBoot开发案例之整合Dubbo提供者(二)
!00.jpg(https://blog.52itstyle.com/usr/uploads/2017/07/1329278006.jpg)大家有没有注意到,上一篇中提供者,暴露接口的方式?混搭。springboot本身接口实现使用了注解的方式,而Dubbo暴露接口使用的是配置文件的实现方式,即如下:代码importorg.s