.NetCore 集成serilog 日志
日志成了现代程序的标配,那么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(); }); }
标签:
.netcore
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性