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