为什么 ILogger 文件日志在生产环境中失败(以及如何修复)

发布: (2025年12月26日 GMT+8 13:38)
4 min read
原文: Dev.to

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 按以下顺序加载配置:

  1. appsettings.json
  2. appsettings.{Environment}.json
  3. 环境变量

如果文件日志仅在 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 本身在生产环境中并未损坏。文件日志失败几乎总是由于缺少提供程序、配置范围错误或文件系统权限问题导致的。解决这些问题后,日志记录将变得可预测、稳定且适用于生产环境。

Back to Blog

相关文章

阅读更多 »

NuGet 中的 WebForms Core

概述:WebForms Core 是由 Elanat 开发的服务器驱动 UI 技术,现已在 NuGet 上正式提供,包名为 WFC。该包允许…

Python 日志:从 print() 到生产

使用 print 的问题:python printf'Processing user {user_id}' printf'Error: {e}' 缺少的内容:- 没有时间戳 - 没有日志级别 - 没有文件输出 - Can't fil...