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