디버깅/에러 뿐만 아니라 통계 목적에서 로거를 많이 사용한다. JSON형태로 로그를 남겨야 통계가 편한다. 이 중 앞으로 사용할 Zlogger는 일반 내장 logger를 비교하면 다음과 같은 이점이 있다.
기존 내장 로거는 다음과 같은 문제를 가진다
Zlogger는 다음과 같은 이점을 가진다.
var builder = WebApplication.CreateBuilder(args);
...
// builder에 서비스 등록
builder.Services.AddLogging(logging =>
{
// optional(MS.E.Logging):clear default providers.
// provider : console, loggerfile, rollingfile
logging.ClearProviders();
// optional(MS.E.Logging): default is Info, you can use this or AddFilter to filtering log.
logging.SetMinimumLevel(LogLevel.Debug);
// provider1. Add Console Logging.
// 콘솔 로깅의 방식을 구조화 된 로깅 방식으로 설정한다.
logging.AddZLoggerConsole(options => { options.EnableStructuredLogging = true; });
// provider2. Add File Logging.
// logging.AddZLoggerFile(String 파일명, Action<ZLoggerOptions> configure)
// 로깅 파일의 방식을 구조화 된 로깅 방식으로 설정한다.
logging.AddZLoggerFile("TestLogFile.log", **options => { options.EnableStructuredLogging = true; }**);
// provider3. Add Rolling File Logging.
// Rolling파일의 파일 명 형태를 설정한다.
logging.AddZLoggerRollingFile((dt, x) => $"logs/{dt.ToLocalTime():yyyy-MM-dd}_{x:000}.log", x => x.ToLocalTime().Date, 1024);
});
...
참고 : 도커에 서버를 돌릴 때는 콘솔 내용들이 자동으로 파일로 로깅 되기 때문에 AddZLoggerConsole()만 설정 해도 된다고 한다.
public class MysqlAccountDb : IAccountDb
{
private readonly ILogger _logger;
public MysqlAccountDb(ILogger<MysqlAccountDb> logger)
{
_logger = logger;
}
...
}
public class LogEventId
{
// Controller 이벤트 id
public static readonly EventId Regist = new EventId(1, "Regist");
public static readonly EventId Login = new EventId(2, "Login");
...
// DB 이벤트 id
public static readonly EventId AccountDb = new Event(101, "AccountDb");
...
}
// 일반적인 로깅(레벨에 따라 Information대신 Error나 Debug등으로 교체)
public static void ZLogInformationWithPayload<TPayload>(this ILogger logger, EventId eventId, TPayload payload, string message)
// 예외 정보를 포함한 로깅
public static void ZLogInformationWithPayload<TPayload>(this ILogger logger, EventId eventId, Exception? exception, TPayload payload, string message)
this ILogger logger
는 생략.EventId eventId
: 로그 항목 구분을 위한 정수형 식별자. 컨트롤러 및 서비스에 따라 EventId를 미리 정의해놓고 사용할 예정.TPayload payload
: 발생한 로깅에 추가 정보를 제공하는 객체/데이터. 요청이나 에러의 원인을 특정할만한 변수의 값을 저장할 예정.string message
: 메세지.