ASP.NET

ASP.Net서버에 Serilog를 이용한 File Logging

washble2 2026. 4. 13. 16:48

1. Serilog 패키지 설치

// Serilog Package 설치
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.File

 

 

 

 

2. Program.cs 상단에 Serilog 설정

(Log설정이 우선 되어야 이후 에러들이 파일이 남습니다)

using Serilog;

var builder = WebApplication.CreateBuilder(args);

// Serilog configuration
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .WriteTo.Console()
    .WriteTo.File("logs/myapp-.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

// Replace default logger with Serilog
builder.Host.UseSerilog();

 

 

 

 

 

3. Log의존성 주입

namespace MyProject.Models.Dao;

public class Dao : IDao
{
    private readonly ServerDbContext _context;
    private readonly ILogger<PremiumGemDao> _logger; // Logger 필드 선언

    // 생성자를 통해 DI(종속성 주입) 받기
    public Dao(ILogger<Dao> logger, ServerDbContext context)
    {
    	_logger = logger;
        _context = context;
    }

    public async Task ProcessPurchase(string userId, string itemId, decimal price)
    {
        // 로그 작성
        _logger.LogInformation("Purchase started: UserID={UserId}, ItemID={ItemId}, Price={Price}", 
            userId, itemId, price);

        try 
        {
            // DB logic here...
        }
        catch (Exception ex)
        {
            // 에러 발생 시 Exception 객체와 함께 로그 기록
            _logger.LogError(ex, "Database error during purchase: UserID={UserId}", userId);
            throw;
        }
    }
}

 

 

 

 

 

 

4. LogLevel 설정

// appsettings.json
{
  "ConnectionStrings": {
    "Db" : "server=localhost;port=3306;database=my_project;uid=root;password=my_password"
  },
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft.AspNetCore": "Warning",
        "Microsoft.EntityFrameworkCore": "Warning"
      }
    }
  }
  "AllowedHosts": "*"
}


// Program.cs
using Serilog;

var builder = WebApplication.CreateBuilder(args);

// Serilog configuration
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .WriteTo.Console()
    .WriteTo.File("logs/eatlivestream-.txt", rollingInterval: RollingInterval.Day)
    .ReadFrom.Configuration(builder.Configuration) // 여기 부분 추가
    .CreateLogger();

// Replace default logger with Serilog
builder.Host.UseSerilog();

 

 

로그 레벨 6단계 (낮은 순서 -> 높은 순서)

레벨 명칭 용도 및 설명
0 Trace 가장 상세한 정보. 주로 개발 중 로직의 흐름을 한 줄 한 줄 추적할 때 사용합니다. (매우 양이 많음)
1 Debug 개발 단계에서 디버깅 목적으로 사용합니다. 운영 환경에서는 보통 끕니다.
2 Information (일반적 기본값) 앱의 정상적인 흐름(서비스 시작, 결제 시도 등)을 기록합니다.
3 Warning 에러는 아니지만 주의가 필요한 상황. (예: 결제 재시도, API 응답 지연, 비정상적인 입력값)
4 Error 현재 작업이 실패한 상태. 예외(Exception)가 발생했을 때 주로 사용하며, 앱은 계속 작동합니다.
5 Critical 아주 치명적인 실패. 시스템 전체가 멈추거나 DB 연결이 완전히 끊기는 등 즉시 조치가 필요한 상황입니다.

 

범주 (Override) 추천 레벨 설명
Microsoft.AspNetCore Warning HTTP 요청 시작/종료, 미들웨어 동작 등 아주 많은 로그를 줄여줍니다.
Microsoft.EntityFrameworkCore Information (개발 시) 실행되는 SQL문을 보고 싶을 때 사용하세요.
Microsoft.EntityFrameworkCore Warning (운영 시) SQL 로그가 너무 많아 파일 용량이 커질 때 사용하세요.

 

 

 

 

5. Log작성 팁

1. 구조적 로깅(Structured Logging) 필수

- 나쁜 예시

$"User {id} login" → 문자열로 합치면 나중에 "특정 유저"로 검색이 안 된다 합니다.
- 옳은 예시
"User {UserId} login", id → 속성 이름(UserId)을 지정해야 로그 분석 툴(ELK, Seq 등)에서 클릭 한 번으로 필터링이 됩니다.

2. 민감 정보 제외 (Security)
- 비밀번호, 주민번호, 카드번호, 계좌비밀번호 등은 절대 로그에 남기지 않습니다. (법적 문제 발생 가능)

3. 로그 수준(Level) 지키기
- 사용자 클릭 하나하나를 Error로 남기면 실제 중요한 에러를 놓칩니다. 일반적인 흐름은 Information, 문제는 Error로 명확히 구분합니다.

4. 영어 권장
- 운영 환경의 인코딩 문제나 글로벌 협업, 로그 분석 툴과의 호환성을 위해 메시지는 가급적 영어로 작성하는 것이 관례입니다.