본문 바로가기
개인공부/Web API 게임 서버 공부

배경지식 - ZLogger

by 하고싶은건많은놈 2023. 4. 20.

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

댓글