为什么 ILogger 文件日志在生产环境中失败(以及如何修复)
Source: Dev.to
为什么许多 .NET 开发者会遇到一个令人困惑的问题:在开发环境中日志写入文件能够正常工作,但在生产环境中却没有生成日志文件。
在本文中我们将解释:
- 为什么会出现这种情况
ILogger实际上做了什么(以及没有做什么)- 最常见的生产环境陷阱
- 一个正确的、适用于生产的文件日志设置
ILogger 不支持文件日志
Microsoft.Extensions.Logging不提供内置文件日志记录器。ILogger只是一个抽象;实际的日志记录由以下提供程序完成:- 控制台
- Debug
- EventSource
- 第三方提供程序(Serilog、NLog 等)
ILogger logger;
logger.LogInformation("Hello World");
上述代码本身永远不会创建文件。
如果在 Development 环境中文件日志“起作用”,那是因为:
- 间接添加了提供程序
- IDE 显示了 Debug 输出
- 配置仅在 Development 中加载
appsettings.Development.json
ASP.NET Core 按以下顺序加载配置:
appsettings.jsonappsettings.{Environment}.json- 环境变量
如果文件日志仅在 appsettings.Development.json 中配置,则在 Production 环境中不会加载这些设置,因此不存在文件日志记录器。
常见的生产陷阱
-
缺少目录 – ASP.NET 不会自动创建目录。
"path": "Logs/app.log"如果
Logs文件夹不存在,则不会创建文件,也不会抛出异常。 -
权限不足 – 生产环境的主机通常在受限账户下运行:
- IIS 应用池身份
- Docker 容器用户
- Linux 服务账户
这些账户可能缺少对目标文件夹的写入权限,导致静默失败。
Source: …
修复:使用带文件接收器的 Serilog
添加所需的包:
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.File
Program.cs
using Serilog;
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog((context, services, configuration) =>
{
configuration
.ReadFrom.Configuration(context.Configuration)
.Enrich.FromLogContext();
});
var app = builder.Build();
app.MapGet("/", (ILogger logger) =>
{
logger.LogInformation("Application started successfully");
return "Hello World";
});
app.Run();
appsettings.json(生产就绪)
{
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs/app-.log",
"rollingInterval": "Day",
"shared": true
}
}
]
}
}
确保日志目录存在并具有适当的权限
-
手动创建文件夹或在日志记录开始前以编程方式创建:
Directory.CreateDirectory("Logs"); -
授予运行时账户写入权限:
-
IIS:
IIS AppPool\YourAppPoolName -
Linux:
chmod -R 755 Logs chown -R appuser:appuser Logs
-
-
Docker / 容器场景 – 挂载可写卷:
volumes: - ./Logs:/app/Logs
在指责 .NET 之前的检查清单
- 已安装并配置文件日志提供程序(例如 Serilog、NLog)。
- 在
appsettings.json中存在日志配置(而不仅仅在appsettings.Development.json中)。 - 日志目录已存在。
- 进程身份对该目录具有写入权限。
- 应用程序不依赖 Debug 输出进行文件日志记录。
ILogger 本身在生产环境中并未损坏。文件日志失败几乎总是由于缺少提供程序、配置范围错误或文件系统权限问题导致的。解决这些问题后,日志记录将变得可预测、稳定且适用于生产环境。