如何让ASP.NET Core 9 Web API的ILogger日志存储在IIS指定目录
解决方案
1. 安装文件日志提供器
ASP.NET Core 默认不包含文件日志功能,需要先安装官方的文件日志 NuGet 包:
Install-Package Microsoft.Extensions.Logging.File
或者使用 .NET CLI:
dotnet add package Microsoft.Extensions.Logging.File
2. 在 Program.cs 中配置日志写入文件
2.1 注册文件日志提供器
在构建 WebApplication 之前,添加文件日志配置,优先读取 IIS 传递的日志路径(同时保留本地默认路径兜底):
var builder = WebApplication.CreateBuilder(args); // 配置文件日志 builder.Logging.AddFile(options => { // 按日期分割日志文件名 options.FileName = "api-logs-{Date}.txt"; // 优先读取 IIS 设置的环境变量路径,否则用应用目录下的 Logs 文件夹 options.LogDirectory = Environment.GetEnvironmentVariable("IIS_APP_LOG_PATH") ?? Path.Combine(AppContext.BaseDirectory, "Logs"); // 以追加模式写入日志 options.Append = true; // 保留最近30天的日志文件 options.RetainedFileCountLimit = 30; // 仅记录 Error 及以上级别的日志(可根据需求调整) options.MinLevel = LogLevel.Error; }); // 注册全局异常处理器 builder.Services.AddExceptionHandler<GlobalExceptionHandler>(); builder.Services.AddProblemDetails(); // 其他服务注册(如控制器) builder.Services.AddControllers(); var app = builder.Build(); // 启用异常处理中间件 app.UseExceptionHandler(); // 其他中间件配置 app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
2.2 注册全局异常处理器
确保已在 Program.cs 中完成 GlobalExceptionHandler 的注册,并启用异常处理中间件(上述代码已包含该逻辑)。
3. 指定 IIS 中的日志文件路径
推荐方式:通过 IIS 传递环境变量(无需修改应用配置)
这种方式能让应用日志路径与 IIS 配置保持一致,且无需硬编码路径:
- 打开 IIS 管理器,找到目标站点,右键选择 配置编辑器
- 在 节 下拉菜单中选择
system.webServer/aspNetCore - 找到
environmentVariables项,点击右侧省略号按钮 - 添加新环境变量:
- 名称:
IIS_APP_LOG_PATH - 值:你在 IIS 中设置的特定日志文件夹路径(例如
D:\IISLogs\MyApi)
- 名称:
- 点击确定,重启站点即可生效
备选方式:手动在 appsettings.json 中配置路径
如果不想用环境变量,可直接在配置文件中指定路径:
{ "Logging": { "File": { "LogDirectory": "D:\\IISLogs\\MyApi", "FileName": "api-logs-{Date}.txt", "MinLevel": "Error" }, "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } } }
然后在 Program.cs 中读取该配置:
builder.Logging.AddFile(builder.Configuration.GetSection("Logging:File"));
关键说明
- 你的
GlobalExceptionHandler已基于ILogger实现,只要配置了正确的日志提供器,日志会自动写入指定路径,无需修改异常处理器代码。 - 使用 IIS 环境变量的方式更灵活:当你在 IIS 中修改日志路径时,应用无需重新部署或修改配置,直接生效。
- 务必确保应用程序池的身份账号具有目标日志文件夹的写入权限,否则日志无法正常写入。
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

