日志成了現代程序的標配,那么serilog是一個優秀的日志框架,擴展性很強,比如結構化日志,但是本文不涉及結構化方面。
1. 安裝Nuget 包 Serilog.AspNetCore ,會提示安裝依賴,把依賴的包都裝上
2. 配置日志,這里用serilog.json 配置文件。
{ "Serilog": { // 日志輸出級別 "MinimumLevel": { "Default": "Debug", "Override": { // 日志調用類命名空間如果以 Microsoft 開頭,覆蓋日志輸出最小級別為 Information "Microsoft": "Information", "Microsoft.Hosting": "Information", "System": "Warning" } }, "WriteTo:Async": { "Name": "Async", "Args": { "configure:File": { "Name": "File", "Args": { "Path": ".\\log\\ForestoryApi_%COMPUTERNAME%_.log", "RollingInterval": "Hour", "Shared": true, //共享打開 "FileSizeLimitBytes": 209715200, "RollOnFileSizeLimit": true, "RetainedFileCountLimit": 30, //保留最后30個日志 "FlushToDiskInterval": "00:00:10", "outputTemplate": "[{Timestamp:HH:mm:ss fff} {Level:u3}]{Message:lj}{NewLine}{Exception}" } }, "configure:EventLog": { "Name": "EventLog", "Args": { "source": "SZ.DALIN.Forestry.Api", "logName": "Forestry", "restrictedToMinimumLevel": "Error" } } } }, "WriteTo:Console": { "Name": "Console", "Args": { "outputTemplate": "發生時間:{Timestamp: HH:mm:ss.fff} 事件等級:{Level:u3} 詳細信息:{Message:lj}{NewLine}{Exception}" } } } }
3. 讀取serilog 配置
public class Program { private static IConfiguration _serilogConfiguration; private static IConfiguration GetSerilogConfiguration(string[] args) { var config = new ConfigurationBuilder() .AddEnvironmentVariables("DOTNET_") .AddEnvironmentVariables("ASPNETCORE_") .AddCommandLine(args) .Build(); var env = config.GetValue<string>("Environment"); return new ConfigurationBuilder().AddConfiguration(config) .AddJsonFile("config/serilog.json", false, false) .AddJsonFile($"config/serilog.{env}.json", true, false) .Build(); } public static void Main(string[] args) { _serilogConfiguration = GetSerilogConfiguration(args); Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(_serilogConfiguration) //.WriteTo.Console() .CreateLogger(); try { CreateHostBuilder(args).Build().Run(); } catch (Exception ex) { Log.Fatal(ex.Message); } finally { Log.CloseAndFlush(); } } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureHostConfiguration(configurationBuilder => { //load env.json, EnvironmentVariables,CommandLine args and serilog.json before loading appsetting.json //so we can change "Environment" and "Url" in env.json, EnvironmentVariables or CommandLine args. configurationBuilder.AddConfiguration(_serilogConfiguration); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureAppConfiguration((webHostBuildContex, configurationBuilder) => { var env = webHostBuildContex.HostingEnvironment.EnvironmentName; configurationBuilder.AddJsonFile("config/appsettings.json", false, true); configurationBuilder.AddJsonFile($"config/appsettings.{env}.json", true, true); }); webBuilder.UseStartup<Startup>(); }) .UseSerilog(); }
4. 運行發現還沒有寫入本地日志,發現忘記安裝一個異步包,再次安裝 Serilog.Sinks.Async
5. 日志塑形,簡化日志 UseSerilogReuestLogging()另外還有比如提高json里面的日志級別,這樣會少很多無用的日志
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseStaticFiles(); app.UseSerilogRequestLogging(options => { // 這些自定義信息可以重寫serilog.json里面的局部配置項,比如替換模板 // 自定義消息模板 options.MessageTemplate = "Handled {RequestPath} {RequestHost}"; // 發出調試級別的事件,而不是默認事件 options.GetLevel = (httpContext, elapsed, ex) => LogEventLevel.Debug; //將其他屬性附加到請求完成事件 options.EnrichDiagnosticContext = (diagnosticContext, httpContext) => { diagnosticContext.Set("RequestHost", httpContext.Request.Host.Value); diagnosticContext.Set("RequestScheme", httpContext.Request.Scheme); }; }); app.UseRouting(); //app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }