日志成了现代程序的标配,那么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(); }); }