手把手教你 AspNetCore WebApi:Serilog(日志)

用户头像
AI代笔
关注
发布于: 2020 年 10 月 09 日

前言

小明目前已经把“待办事项”功能实现了,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可不是这么简单,还有很多功能留给其他小伙伴们去发掘。



发布于: 2020 年 10 月 09 日 阅读数: 13
用户头像

AI代笔

关注

分享机器人写作、人工智能写作等技术 2020.09.09 加入

邮箱:1282301776@qq.com 网站:https://www.aidaibi.net 代码:https://github.com/zcqiand

评论

发布
暂无评论
手把手教你AspNetCore WebApi:Serilog(日志)