프로덕션에서 ILogger 파일 로깅이 실패하는 이유 (및 해결 방법)

발행: (2025년 12월 26일 오후 02:38 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

많은 .NET 개발자들이 개발 환경에서는 파일 로깅이 완벽하게 작동하지만, 프로덕션 환경에서는 로그 파일이 생성되지 않는 혼란스러운 문제를 겪는 이유는 무엇일까요.

이 기사에서는 다음과 같이 설명합니다:

  • 왜 이런 현상이 발생하는지
  • ILogger가 실제로 하는 일(및 하지 않는 일)
  • 가장 흔한 프로덕션 함정
  • 올바른 프로덕션‑준비 파일 로깅 설정

Source:

ILogger 파일 로깅을 지원하지 않음

  • Microsoft.Extensions.Logging내장 파일 로거를 제공하지 않습니다.
  • ILogger는 단지 추상화일 뿐이며, 실제 로깅은 다음과 같은 제공자를 통해 수행됩니다:
    • 콘솔
    • 디버그
    • EventSource
    • 서드파티 제공자(Serilog, NLog 등)
ILogger logger;
logger.LogInformation("Hello World");

위 코드는 스스로 파일을 생성하지 않습니다.

개발 환경에서 파일 로깅이 “작동”했다면, 그 이유는 다음 중 하나였을 가능성이 높습니다:

  • 제공자가 간접적으로 추가되었음
  • IDE가 디버그 출력을 표시했음
  • 설정이 개발 환경에서만 로드되었음

appsettings.Development.json

ASP.NET Core는 다음 순서대로 설정을 로드합니다:

  1. appsettings.json
  2. appsettings.{Environment}.json
  3. 환경 변수

파일 로깅이 오직 appsettings.Development.json에만 구성되어 있다면, 프로덕션 환경에서는 해당 설정이 로드되지 않으므로 파일 로거가 존재하지 않게 됩니다.

일반적인 프로덕션 함정

  • 디렉터리 누락 – ASP.NET은 디렉터리를 자동으로 생성하지 않습니다.

    "path": "Logs/app.log"

    Logs 폴더가 존재하지 않으면 파일이 생성되지 않으며 예외도 발생하지 않습니다.

  • 권한 부족 – 프로덕션 호스트는 종종 제한된 계정으로 실행됩니다:

    • IIS 앱 풀 아이덴티티
    • Docker 컨테이너 사용자
    • Linux 서비스 계정

    이러한 계정은 대상 폴더에 대한 쓰기 권한이 없을 수 있어, 조용한 실패가 발생합니다.

해결: 파일 싱크와 함께 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 자체는 Production에서 깨지지 않는다. 파일‑로깅 실패는 거의 항상 제공자 누락, 잘못된 범위의 구성, 혹은 파일 시스템 권한 문제 때문에 발생한다. 이러한 문제를 해결하면 로깅은 예측 가능하고 안정적이며 프로덕션‑안전해진다.

Back to Blog

관련 글

더 보기 »

NuGet에서 WebForms Core

개요 WebForms Core는 Elanat에서 개발한 서버‑기반 UI 기술로, 이제 공식적으로 NuGet에서 패키지 이름 WFC로 제공됩니다. 이 패키지는…