.NET 6 Web API中Serilog配置及日志路径、多目标输出问题
.NET 6 Web API Serilog配置及GreyLog对接问题解决方案
1. 让Serilog全局生效(控制器可正常使用)
核心是将Serilog替换为ASP.NET Core的默认日志提供器,按以下步骤配置:
安装必要NuGet包:
Install-Package Serilog.AspNetCore在Program.cs中先初始化Serilog,再替换默认日志提供器:
using Serilog; // 初始化Serilog配置 Log.Logger = new LoggerConfiguration() .WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); try { var builder = WebApplication.CreateBuilder(args); // 替换默认日志提供器为Serilog builder.Host.UseSerilog(); // 正常配置控制器及其他服务 builder.Services.AddControllers(); // ...其他服务配置 var app = builder.Build(); // ...中间件配置 app.Run(); } catch (Exception ex) { Log.Fatal(ex, "应用启动失败"); } finally { Log.CloseAndFlush(); }完成后,控制器中直接注入
ILogger<AdminController>即可使用Serilog,无需额外操作。
2. 正确映射日志路径(替代.NET Framework的MapPath)
手动注入IWebHostEnvironment拼接路径是正确的,推荐两种更规范的实现方式:
方式一:代码中动态拼接路径
利用IWebHostEnvironment的ContentRootPath(项目根目录)或WebRootPath(wwwroot目录)拼接:
var contentRootPath = builder.Environment.ContentRootPath; var logFilePath = Path.Combine(contentRootPath, "logs", "old_project_.log"); // 配置Serilog时使用该路径 Log.Logger = new LoggerConfiguration() .WriteTo.File(logFilePath, rollingInterval: RollingInterval.Day) .CreateLogger();
方式二:通过配置文件指定路径
在appsettings.json中添加Serilog配置:
{ "Serilog": { "WriteTo": [ { "Name": "File", "Args": { "path": "logs/old_project_.log", "rollingInterval": "Day" } } ] } }
然后在Program.cs中读取配置:
Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) .CreateLogger();
此处相对路径默认基于项目根目录,和.NET Framework的MapPath(@"~/")效果一致。
3. 用现有ILogger同时输出文件和GreyLog
完全可以实现,只需给Serilog添加多个输出目标(Sink):
安装GreyLog的Serilog Sink包:
Install-Package Serilog.Sinks.GrayLog在Serilog配置中同时添加文件和GreyLog输出:
Log.Logger = new LoggerConfiguration() // 文件输出 .WriteTo.File(Path.Combine(builder.Environment.ContentRootPath, "logs", "old_project_.log"), rollingInterval: RollingInterval.Day) // GreyLog输出,替换为你的服务地址 .WriteTo.GrayLog(new GrayLogSinkOptions { HostnameOrAddress = "你的GreyLog服务器IP/域名", Port = 12201 // 默认GELF UDP端口 }) .CreateLogger();配置完成后,控制器中
ILogger<AdminController>输出的所有日志会同时发送到文件和GreyLog,无需修改控制器的日志代码。
内容的提问来源于stack exchange,提问作者Sonnich Jensen
相关产品推荐
相关产品推荐

