.Net Core項目中整合Serilog

前言: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多插件,我只列舉了以上幾個。

 以後慢慢了解吧!

🙂

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章