前言
小明目前已經把“待辦事項”功能實現了,API文件也搞定了,但是馬老闆說過,絕對不能讓沒有任何監控的專案上線的。
Serilog是什麼?
在.NET使用日誌框架第一時間會想到NLog或是Log4Net,Serilog 是這幾年快速崛起的Log框架之一,Serilog是以Structured logging 為基礎進行設計,透過logging API 可以輕鬆的記錄應用程式中物件屬性,方便快速進行logging 內容進行查詢與分析,並將其紀錄內容透過json (可指定) 的方式輸出。
使用
首先,將Serilog.AspNetCore NuGet軟體包安裝到您的應用程式中。
dotnet add package Serilog.AspNetCore
接下來,在應用程式的Program.cs檔案中,首先配置Serilog。
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
try
{
Log.Information("啟動主機");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "主機意外終止");
}
finally
{
Log.CloseAndFlush();
}
}
然後,新增UseSerilog()到中的通用主機CreateHostBuilder()。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog() // <-新增此行
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
然後,通過刪除預設記錄器的其餘配置進行清理:
- "Logging"從appsettings.json檔案中刪除此部分
最後,除錯啟動vs,可以檢視以下效果:
在控制器使用
首先.NETCore通過繼承 ILogger介面實現了它自己的日誌記錄。通過藉助依賴注入機制,它可以很容易地使用。
private readonly TodoContext context;
private readonly ILogger<TodosController> logger; // <-新增此行
public TodosController(TodoContext context, ILogger<TodosController> logger)
{
this.context = context ?? throw new ArgumentNullException(nameof(context));
this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); // <-新增此行
}
/// <summary>
/// 獲取所有待辦事項
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ActionResult<IEnumerable<Todo>>> GetTodo()
{
logger.LogInformation("啟動{ActionName}", "獲取所有待辦事項"); // <-新增此行
var todos = await context.Todo.ToListAsync();
return todos;
}
測試GetTodo介面,再次檢視以下效果:
輸出到檔案
在原來的輸出到控制檯的基礎上增加.WriteTo.File(@"C:\LogFiles\log.txt")就可以了。
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File(
@"C:\LogFiles\log.txt")
.CreateLogger();
再次檢視以下效果:
使用配置檔案
更改appsettings.json內容:
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": { "path": "C:\\LogFiles\\log.txt" }
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
},
更改Program類,使用ReadFrom.Configuration()並傳遞一個IConfiguration物件。
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
.AddEnvironmentVariables()
.Build();
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.Enrich.FromLogContext()
.CreateLogger();
try
{
Log.Information("啟動主機");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "主機意外終止");
}
finally
{
Log.CloseAndFlush();
}
}
小結
目前為止,小明把日誌記錄也搞定了,摸了摸光滑的腦袋,對於優秀青年小明來說新增日誌按時so easy!當然Serilog可不是這麼簡單,還有很多功能留給其他小夥伴們去發掘。