ZLogger
.NET Core에서 사용 가능한 로깅 라이브러리로, Z는 Zero Allocation을 뜻함
NuGet을 통해 다운로드 가능
위 그림과 같이 .Net Core의 기본 Logger는 object를 boxing하고 string을 UTF8로 인코딩하는데 추가적인 비용이 발생함
반면 ZLogger의 경우
- zero allocation string 빌더인 ZString을 사용하여 버퍼영역에 직접 UTF8로 작성함
- 로그 문자열을 콘솔에 출력하기 위한 ConsoleStream에 한번에 보내기 때문에 Boxing이 발생하지 않음
- 비동기적으로 작동하기 때문에 애플리케이션에 부하를 주지 않음
- ConsoleLogging 외에도 FileLogger, RollingFileLogger, StreamLogger를 제공함
- 기본적으로는 Microsoft.Extensions.Logging의 로깅 방법을 따름
ZLogger를 사용한 로깅
Logging에 관한 기본적인 내용들은 https://sueshin.tistory.com/182의 로깅 항목에 서술
using ZLogger;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddLogging();
builder.Logging.ClearProviders();
builder.Logging.AddZLoggerConsole();
ZLogger를 사용한 로깅도 기존 .Net Core의 로깅 방법과 큰 차이가 없음
단, AddLoggerConsole()이 AddZLoggerConsole()으로 변경된 것처럼 메서드들에 Z를 붙여 사용
builder.Logging.AddZLoggerConsole(options =>
{
options.EnableStructuredLogging = true;
});
위와 같이 구조화된 로깅(Structured Logging)을 사용 가능
기본 output은 로그 information(categoryName, level, timestamp, exception) / message / payload를 포함한 JSON으로 설정되어있음
이 때 System.Text.Json.JsonSerializer를 사용하여 로그를 json화하며, 추가적인 할당이 이루어지지 않음
builder.Logging.AddZLoggerFile("fileName.log");
builder.Logging.AddZLoggerRollingFile((dt, x) => $"logs/{dt.ToLocalTime():yyyy-MM-dd}_{x:000}.log", x => x.ToLocalTime().Date, 1024);
위와 같이 로그를 파일에 출력하거나, 날짜-시간 / 파일 크기에 따라 출력 파일 경로를 변경하는 것도 가능
RollingFile의 경우 아래 매개변수들을 활용
- Func<DateTimeOffset, int, string> fileNameSelector
생성된 파일 경로의 선택자 - Func<DateTimeOffset, DateTimeOffset> timestampPattern
새 파일을 생성해야한다는 술어
반환값이 마지막으로 작성된 시간과 다를 경우 fileNameSelector를 호출하여 새 파일에 씀 - int rollSizeKB
제한된 파일 크기
오버플로우가 발생할시 fileNameSelector를 호출하여 새 파일에 씀
public class MyClass
{
readonly ILogger<MyClass> logger;
public MyClass(ILogger<MyClass> logger)
{
this.logger = logger;
}
logger.ZLogDebug("foo{0} bar{1}", 10, 20);
}
로그를 찍을 때도 기존에 사용하던 방법과 거의 동일함
ZLogDebug 외에도 사용하고싶은 로깅 레벨에 따라 ZLogInformation 등의 메서드로 변경할 수 있음
logging.AddZLoggerConsole(options =>
{
options.PrefixFormatter = (writer, info) => ZString.Utf8Format(writer, "[{0}][{1}]", info.LogLevel, info.Timestamp.DateTime.ToLocalTime());
var prefixFormat = ZString.PrepareUtf8<LogLevel, DateTime>("[{0}][{1}]");
options.PrefixFormatter = (writer, info) => prefixFormat.FormatTo(ref writer, info.LogLevel, info.Timestamp.DateTime.ToLocalTime());
});
logger.ZLogInformation("fooooo!");
// output:
// [Information][04/07/2020 20:21:46]fooooo!
위와 같이 PrefixFormatter() 메서드를 사용하여 Log의 포맷을 변경할 수 있음
'개인공부 > Web API 게임 서버 공부' 카테고리의 다른 글
Web API 서버 예시 (0) | 2023.04.24 |
---|---|
배경지식 - Web 서버 구조 (0) | 2023.04.23 |
배경지식 - Redis (0) | 2023.04.20 |
배경지식 - ORM (1) | 2023.04.20 |
배경지식 - C# (0) | 2023.04.20 |
댓글