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

首先导入要用到的NuGet包:

  1. #region 这两个包是引入Serilog的关键
  2. Serilog
  3. Serilog.AspNetCore
  4. #endregion
  5. //控制台输出
  6. Serilog.Sinks.Console
  7. //发送邮件
  8. Serilog.Sinks.Email
  9. //将日志写入到文件
  10. Serilog.Sinks.File
  11. //推送日志至数据库
  12. Serilog.Sinks.MssqlServer

1.输出到控制台

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

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

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

  1. .WriteTo.Console(theme: SystemConsoleTheme.Colored)

  1. .WriteTo.Console(theme: AnsiConsoleTheme.Code)

 也可以自定义输出的模板

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

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

导包:Serilog.Settings.Configuration

在appsettings.json加入以下json块儿

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

2.将日志写入到文件

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

将配置信息添加到json中

  1. "Serilog": {
  2. "WriteTo": [
  3. {
  4. "Name": "Console",
  5. "Args": {
  6. "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
  7. "outputTemplate": "发生时间:{Timestamp: HH:mm:ss.fff} 事件等级:{Level} 详细信息:{Message}{NewLine}{Exception}",
  8. }
  9. },
  10. {
  11. "Name": "File",
  12. "Args": {
  13. "path": "MyLogs/log.txt",
  14. "rollingInterval": "Day",
  15. "outputTemplate": "发生时间:{Timestamp: HH:mm:ss.fff} 事件等级:{Level} 详细信息:{Message}{NewLine}{Exception}"
  16. }
  17. }
  18. ]
  19. }
  1. 将这句代码注释掉:.WriteTo.File(Path.Combine("MyLogs", "log"), rollingInterval: RollingInterval.Day)

3.将日志推送到数据库

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

 4.发送邮件

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

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

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

 发送成功!

 

 完整代码:

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

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

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

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

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

请看此篇博客:

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

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

 以后慢慢了解吧!

版权声明:本文为zhangnever原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhangnever/p/12459399.html