­

.Net Core项目中整合Serilog

  • 2020 年 3 月 11 日
  • 笔记

前言:Serilog是.NET应用程序的诊断日志记录库。它易于设置,具有简洁的API,并且可以在所有最新的.NET平台上运行。尽管即使在最简单的应用程序中它也很有用,但当对复杂的,分布式的和异步的应用程序和系统进行检测时,Serilog对结构化日志记录的支持便会更加出色。

首先导入要用到的NuGet包:

#region 这两个包是引入Serilog的关键  Serilog  Serilog.AspNetCore  #endregion  //控制台输出  Serilog.Sinks.Console  //发送邮件  Serilog.Sinks.Email  //将日志写入到文件  Serilog.Sinks.File  //推送日志至数据库  Serilog.Sinks.MssqlServer

1.输出到控制台

   public static void Main(string[] args)          {              Log.Logger = new LoggerConfiguration()                  .MinimumLevel.Information()//最小的记录等级                  .MinimumLevel.Override("Microsoft", LogEventLevel.Information)//对其他日志进行重写,除此之外,目前框架只有微软自带的日志组件                  .WriteTo.Console()//输出到控制台                  .CreateLogger();                Log.Information("info");              Log.Error("err");              CreateHostBuilder(args).Build().Run();          }

在终端中不同等级的日志颜色不同

Serilog提供了两个类(SystemConsoleThemes和AnsiConsoleThemes)用于主题的变化

 .WriteTo.Console(theme: SystemConsoleTheme.Colored)

.WriteTo.Console(theme: AnsiConsoleTheme.Code)

 也可以自定义输出的模板

.WriteTo.Console(theme: AnsiConsoleTheme.Code,                   outputTemplate: "发生时间:{Timestamp: HH:mm:ss.fff} 事件级别:{Level} 详细信息:{Message}{NewLine}{Exception}")

 我们也可以将这些配置项写入到appsettings.json文件中

导包:Serilog.Settings.Configuration

在appsettings.json加入以下json块儿

  "Serilog": {      "WriteTo": [        {          "Name": "Console",          "Args": {            "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",            "outputTemplate": "发生时间:{Timestamp: HH:mm:ss.fff} 事件等级:{Level} 详细信息:{Message}{NewLine}{Exception}"          }        }      ]    }
   Log.Logger = new LoggerConfiguration()                  .MinimumLevel.Information()                  .MinimumLevel.Override("Microsoft", LogEventLevel.Information)                  .ReadFrom.Configuration(new ConfigurationBuilder()                  .AddJsonFile("appsettings.json")                  .Build())                  .CreateLogger();

2.将日志写入到文件

  Log.Logger = new LoggerConfiguration()                  .MinimumLevel.Information()                  .MinimumLevel.Override("Microsoft", LogEventLevel.Information)                  .ReadFrom.Configuration(new ConfigurationBuilder()                  .AddJsonFile("appsettings.json")                  .Build())                  .WriteTo.File(Path.Combine("MyLogs", "log"), rollingInterval: RollingInterval.Day)//文件生成到当前路径 rollingInterval:RollingInterval.Day:按天生成文件                  .CreateLogger();

将配置信息添加到json中

"Serilog": {      "WriteTo": [        {          "Name": "Console",          "Args": {            "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",            "outputTemplate": "发生时间:{Timestamp: HH:mm:ss.fff} 事件等级:{Level} 详细信息:{Message}{NewLine}{Exception}",            }        },        {          "Name": "File",          "Args": {            "path": "MyLogs/log.txt",            "rollingInterval": "Day",            "outputTemplate": "发生时间:{Timestamp: HH:mm:ss.fff} 事件等级:{Level} 详细信息:{Message}{NewLine}{Exception}"          }        }      ]    }
将这句代码注释掉:.WriteTo.File(Path.Combine("MyLogs", "log"), rollingInterval: RollingInterval.Day)

3.将日志推送到数据库

   Log.Logger = new LoggerConfiguration()                  .MinimumLevel.Information()                  .MinimumLevel.Override("Microsoft", LogEventLevel.Information)                  .ReadFrom.Configuration(new ConfigurationBuilder()                  .AddJsonFile("appsettings.json")                  .Build())                  .WriteTo.MSSqlServer("Data Source=DESKTOP-4TU9A6M;Initial Catalog=CoreFrame;User ID=sa;Password=123456", "logs", autoCreateSqlTable: true, restrictedToMinimumLevel: LogEventLevel.Information)//从左至右四个参数分别是数据库连接字符串、表名、如果表不存在是否创建、最低等级。Serilog会默认创建一些列。                   .CreateLogger();

 4.发送邮件

.WriteTo.Email(new EmailConnectionInfo()   {     EmailSubject = "系统警告,请速速查看!",//邮件标题     FromEmail = "291***@qq.com",//发件人邮箱     MailServer = "smtp.qq.com",//smtp服务器地址     NetworkCredentials = new NetworkCredential("291***@qq.com", "###########"),//两个参数分别是发件人邮箱与客户端授权码     Port = 587,//端口号     ToEmail = "183***@163.com"//收件人    })

如果对客户端授权码不熟悉的同学可移步此博客

https://www.cnblogs.com/zhangnever/p/11926020.html

 发送成功!

 

 完整代码:

public class Program      {          public static void Main(string[] args)          {              Log.Logger = new LoggerConfiguration()                  .MinimumLevel.Information()                  .MinimumLevel.Override("Microsoft", LogEventLevel.Information)                  .ReadFrom.Configuration(new ConfigurationBuilder()                  .AddJsonFile("appsettings.json")                  .Build())                  .WriteTo.MSSqlServer("Data Source=DESKTOP-4TU9A6M;Initial Catalog=CoreFrame;User ID=sa;Password=123456", "logs", autoCreateSqlTable: true, restrictedToMinimumLevel: LogEventLevel.Information)//从左至右四个参数分别是数据库连接字符串、表名、如果表不存在是否创建、最低等级。Serilog会默认创建一些列。                                  .WriteTo.Email(new EmailConnectionInfo()                  {                      EmailSubject = "系统警告,请速速查看!",//邮件标题                      FromEmail = "291***@qq.com",//发件人邮箱                      MailServer = "smtp.qq.com",//smtp服务器地址                      NetworkCredentials = new NetworkCredential("291***@qq.com", "###########"),//两个参数分别是发件人邮箱与客户端授权码                      Port = 587,//端口号                      ToEmail = "188***@163.com"//收件人                  })                  .CreateLogger();                Log.Information("info");              Log.Error("err");              CreateHostBuilder(args).Build().Run();          }            public static IHostBuilder CreateHostBuilder(string[] args) =>              Host.CreateDefaultBuilder(args)                  .ConfigureWebHostDefaults(webBuilder =>                  {                      webBuilder.UseSerilog()//在宿主机启动的时候配置serilog,与微软ILogger进行整合                                .UseStartup<Startup>();                  });      }

我们在用的时候可以直接在控制器中注入ILogger

例如微软的天气预报的控制器:

  private readonly ILogger<WeatherForecastController> _logger;      public WeatherForecastController(ILogger<WeatherForecastController> logger)    {       _logger = logger;    }
//直接在接口中使用: _logger.LogInformation("success");

最好配合过滤器一起使用,达到AOP的效果

请看此篇博客:

https://www.cnblogs.com/zhangnever/p/12397117.html

 其实Serilog还有N多插件,我只列举了以上几个。

 以后慢慢了解吧!

?