Serilog은 .NET 환경에서 구조화된 로깅을 지원하는 인기 있는 오픈소스 라이브러리입니다. 텍스트 기반 로그 대신 JSON 등의 구조화된 형식으로 로그를 출력하여 분석과 검색이 용이합니다. 아래에서 기본적인 설치부터 사용법을 단계별로 정리하겠습니다. (ASP.NET Core를 기준으로 설명하며, 콘솔 앱 등에도 유사하게 적용 가능합니다.)
1. 설치 (NuGet 패키지 관리자)
Serilog을 사용하려면 Visual Studio의 NuGet 패키지 관리자를 통해 다음 패키지들을 설치하세요:
- Serilog: 코어 라이브러리.
- Serilog.AspNetCore: ASP.NET Core 통합 (DI 지원).
- Serilog.Sinks.Console: 콘솔 출력 싱크.
- Serilog.Sinks.File: 파일 출력 싱크 (필요 시).
설치 명령어 (Package Manager Console 또는 CLI):
Install-Package Serilog
Install-Package Serilog.AspNetCore
Install-Package Serilog.Sinks.Console
Install-Package Serilog.Sinks.File
2. 기본 설정
Program.cs 파일에서 Serilog을 초기화합니다. Log.Logger를 설정한 후, ASP.NET Core 앱에 등록하세요.
Program.cs 예제 ( .NET 6+ Minimal API 스타일):
using Serilog;
var builder = WebApplication.CreateBuilder(args);
// Serilog 설정
Log.Logger = new LoggerConfiguration()
.WriteTo.Console() // 콘솔 출력
.WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day) // 일일 롤링 파일 출력
.CreateLogger();
builder.Host.UseSerilog(); // ASP.NET Core에 Serilog 등록
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
- appsettings.json 사용 (옵션): 설정을 JSON 파일로 외부화할 수 있습니다.
{
"Serilog": {
"WriteTo": [
{ "Name": "Console" },
{ "Name": "File", "Args": { "path": "logs/log-.txt", "rollingInterval": "Day" } }
]
}
}
이 경우 Program.cs에서 builder.Host.UseSerilog();만 호출하면 자동 로드됩니다.
3. 로거 사용
컨트롤러나 서비스 클래스에서 ILogger<T>를 주입받아 사용합니다. 로그 레벨: Verbose, Debug, Information, Warning, Error, Fatal.
컨트롤러 예제 (Controllers 폴더의 HomeController.cs):
using Microsoft.AspNetCore.Mvc;
using Serilog;
namespace YourApp.Controllers
{
[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
[HttpGet]
public IActionResult Get()
{
_logger.Information("홈 페이지 요청이 들어왔습니다."); // 정보 로그
try
{
// 비즈니스 로직
_logger.Debug("디버그 로그 예시");
}
catch (Exception ex)
{
_logger.Error(ex, "오류 발생: {ErrorMessage}", ex.Message); // 오류 로그 (예외 포함)
}
return Ok("Success");
}
}
}
- 로그 레벨 필터링: 설정에서 최소 레벨 지정 가능 (e.g., .MinimumLevel.Information()).
4. 싱크 추가 (출력 대상 확장)
싱크(Sink)는 로그의 출력 방식을 정의합니다. 기본 싱크 외에 추가 설치 후 설정하세요.
| 싱크 이름 | 패키지 | 설정 예제 | 설명 |
| Console | Serilog.Sinks.Console | .WriteTo.Console() | 콘솔에 텍스트/JSON 출력. |
| File | Serilog.Sinks.File | .WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day) | 파일에 롤링 저장 (일/월 단위). |
| Seq | Serilog.Sinks.Seq | .WriteTo.Seq("http://localhost:5341") | Seq 서버로 전송 (분석 도구). 설치: Install-Package Serilog.Sinks.Seq. |
| Application Insights | Serilog.Sinks.ApplicationInsights | .WriteTo.ApplicationInsights(...) | Azure 모니터링 연동. |
확장 설정 예제:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}")
.WriteTo.File("logs/log.json", rollingInterval: RollingInterval.Day, outputTemplate: null) // JSON 형식 파일
.CreateLogger();
5. 구조화된 로깅 (Structured Logging)
Serilog의 강점으로, 로그를 키-값 쌍으로 구조화하여 JSON으로 저장합니다. 검색/분석에 유리합니다.
예제:
var user = new { Id = 123, Name = "홍길동" };
var elapsedMs = 154;
_logger.Information("사용자 {UserId} 로그인 시도, 소요 시간 {ElapsedMs}ms", user.Id, elapsedMs);
// 또는 객체 전체: _logger.Information("로그인 시도 {@User}", user);
_logger.Warning("위험한 작업: {DangerousOperation}", "파일 삭제");
출력 예 (JSON 파일):
{
"@t": "2025-11-14T10:00:00.0000000Z",
"@mt": "사용자 {UserId} 로그인 시도, 소요 시간 {ElapsedMs}ms",
"UserId": 123,
"ElapsedMs": 154,
"@l": "Information"
}
- 템플릿 팁: {@Object}는 객체 구조 보존, {Object}는 ToString() 호출. 형식 지정: {ElapsedMs:000} (3자리 패딩).
추가 팁
- 성능: Enrichers로 컨텍스트 추가 (e.g., 사용자 ID, 머신명). .Enrich.WithMachineName().
- 테스트: Log.ForContext<T>()로 컨텍스트별 로거 생성.
- 문제 해결: 로그가 안 찍히면 Log.CloseAndFlush() 호출 확인. 공식 문서: serilog.net.
- 고급: ELK 스택(Elasticsearch) 연동 시 Serilog.Sinks.Elasticsearch 사용.
주의
- FileEx를 사용하면 Application started, Application is shutting down이 될때마다 파일이 _001, _002 의 식으로 생성.
'IT관련 > C#' 카테고리의 다른 글
| CP949 인코딩이란? (0) | 2025.10.27 |
|---|---|
| .NET의 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)란? (0) | 2025.10.27 |
| C# 원격 디버깅 자격 증명: MS 계정 이메일의 'abc'만 입력하는 이유 완벽 해부 (0) | 2025.10.23 |
| C# 원격 디버깅 통신 메커니즘: 깊이 파헤치기 (상세 버전) (0) | 2025.10.23 |
| VS2017: "원격 컴퓨터 사용" 옵션 vs. "디버그 > 프로세스에 연결" 차이점 완벽 정리 (1) | 2025.10.23 |