programming

ILogger의 구현체로 Serilog를 사용하기

programmer j 2024. 10. 1. 19:57

SerilogExample.zip
0.01MB

 

Microsoft.Extensions.Logging.ILogger의 구현체로 Serilog를 사용해서 로깅하기

 

1. 프로젝트 구성

- Visual Studio 2022 Version 17.11.4

- Target framework : .NET 8.0
- SerilogExample

          SerilogExConsoleApp1

          CalcLib

          SerilogWpfApp1

 

2. 필요한 nuget패키지

Microsoft.Extensions.Configuration

Microsoft.Extensions.Configuration.FileExtensions

Microsoft.Extensions.Configuration.Json

Microsoft.Extensions.Logging

Serilog

Serilog.Enrichers.CallerInfo

Serilog.Enrichers.Environment

Serilog.Enrichers.Thread

Serilog.Extensions.Logging

Serilog.Settings.Configuration

Serilog.Sinks.Console

Serilog.Sinks.File

Serilog.Sinks.Seq

 

3. Serilog의 출력을 Seq서버에 저장할 경우 필요한 프로그램

- Seq :https://datalust.co/download

- Seq설치방법 참고자료

  https://forum.dotnetdev.kr/t/log-viewer-feat-serilog/9492

  https://kjun.kr/1355

 

4. Serilog를 이용해 Microsoft.Extensions.Logging.ILogger만들기

			:
// 1. Serilog LoggerConfiguration 설정
var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("SerilogSetting.json")
    .Build();

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();

// 2. LoggerFactory 생성 및 Serilog 추가
using var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddSerilog();  // Serilog를 ILogger 구현체로 추가
});

// 3. ILogger 인스턴스 생성
Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger<Program>();
			:

 

5. Serilog 설정파일의 로그출력 패턴 예

5.1 Console sink설정값

 

"Args": {

  "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Namespace}.{Method} {Message}{NewLine}{Exception}"

}

 

outputTemplate : 로그메시지 형식

{Timestamp:yyyy-MM-dd HH:mm:ss.fff} : 날짜 시간정보

{Level:u3} : 로그레벨정보(3글자)

{Namespace} : 로그출력 메쏘드가 호출된 클래스이름(네임스페이스 포함)

{Method} : 로그출력 메쏘드가 호출된 메쏘드이름

{Message} : 로그메시지

{NewLine} : 줄바꿈

{Exception} : 예외가 있을 경우 예외정보

 

Console로그예

Console로그출력

- log4net은 색깔 구분이 없음

 

5.2 File sink설정값

 

File로그설정

path : 로그파일 이름

retainedFileCountLimit : 로그파일 개수 제한

fileSizeLimitBytes : 로그파일 크기 제한

rollOnFileSizeLimit : 지정된 로그파일 크기가 되면 새로운 파일 생성 여부 설정

 

- 위 로그설정에 대한 로그파일 생성 동작

파일 크기가 1KB가 넘으면 app_번호.log로 새로운 파일을 만들고 이 파일에 로그를 저장한다.

app_번호.log의 번호가  제일 큰 파일에 가장 최근 로그가 있다.

(처음에는 app.log파일이 생성되지만 app_번호.log파일이 생성되면서 app.log는 지워진다)

 

log4net저장방식과 다르다

log4netapp.log에 계속 로그를 저장한다(app.log가 가장 최근 로그).

이전 로그파일은 “app.log.--의 파일 이름으로 저장한다.

 

파일로그예

File로그출력

 

5.3 Seq sink설정값

 

"Args": {

  "serverUrl": "http://localhost:5341"

}

 

serverUrl : Seq서버 주소

 

Seq로그예

Seq로그예1

 

Seq의 예외로그예

Seq로그예2

 

 

 

6. WithCallerInfo enricher사용시 주의사항

- allowedAssemblies설정이 잘못되면 {Namespace}.{Method} 출력이 정상적으로 되지 않는다.

 

콘솔앱( SerilogExConsoleApp1)용 SerilogSetting.jsonWithCallerInfo enricher설정

WPF앱( SerilogWpfApp1)용 SerilogSetting.jsonWithCallerInfo enricher설정

 

SerilogWpfApp1SerilogExConsoleApp1WithCallerInfo enricher설정을 사용하면 아래와 같이 일부 정보가 빠진 로그출력이 나온다(File sink 출력예, 클래스이름.메쏘드이름이 출력되야 하는데, .만 출력된다) 

 

allowedAssemblies설정이 잘못된 예
클래스이름.메쏘드이름 정보가 안나오는 예