2023. 10. 24. 15:30

전 포스팅에서 .NET기본 로거를 사용하는 방법을 알아봤습니다.

로거를 파일로 출력하려면 외부 라이브러리를 사용해야 합니다.

 

이 포스팅에서는 'NReco.Logging.File'를 이용하여 로그를 파일로 출력합니다.

 

연관글 영역

 

 

 

1. 라이브러리 설치 

.NET에서 로그를 파일로 내보내는 기능은 외부 라이브러리를 쓰라고 되어 있습니다.

(더 이상 기본기능으로 제공하지 않음)

 

이 포스팅에서는 'NReco.Logging.File'를 사용합니다.

 

 

2. 파일 출력 설정 

파일 출력을 위해 파일명을 지정하고 로거빌더(LoggingBuilder)에서 출력 형식을 지정해 줍니다.

 

 

2-1. 'StartUp.cs'를 사용하지 않는 경우 

서비스에서 'AddLogging'을 이용하여 외부 빌더를 설정해 줍니다.

builder.Services.AddLogging(loggingBuilder
	=> loggingBuilder.AddFile("Logs/Log_{0:yyyy}-{0:MM}-{0:dd}.log"
        , fileLoggerOpts =>
        {
            //파일 출력 이름
            fileLoggerOpts.FormatLogFileName = sNameFormat =>
            {
                return String.Format(sNameFormat, DateTime.Now);
            };
        }));

 

이 코드는 현재 시간으로 파일을 만들어 줍니다.

 

2-2. 'StartUp.cs'를 사용하는 경우

'ConfigureServices'에서 로깅(Logging)을 추가할 수 있습니다.

public void ConfigureServices(IServiceCollection services)
{
	... 중략 ...
    
    //로그 파일 설정
    services.AddLogging(loggingBuilder
        => loggingBuilder.AddFile("Logs/Log_{0:yyyy}-{0:MM}-{0:dd}.log"
            , fileLoggerOpts =>
            {
                //파일 출력 이름
                fileLoggerOpts.FormatLogFileName = sNameFormat =>
                {
                    return String.Format(sNameFormat, DateTime.Now);
                };
            }));
    
    ... 중략 ...
}

 

3. 세부 설정

메시지 커스텀에서 부터 시작해서 다양한 설정이 가능합니다.

 

3-1. 시간 표시 설정 

'FormatLogEntry'를 이용하면 원하는 포맷으로 로그를 만들 수 있습니다.

fileLoggerOpts.FormatLogEntry = (lmMsg) =>
{
    return $"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}] {lmMsg.LogLevel} [{lmMsg.LogName}] {lmMsg.Message}";
};

 

이렇게 출력됩니다.

 

 

3-2. 로그 정보에 따른 메시지 커스텀 

로그 정보를 가지고 원하는 대로 메시지를 커스텀 할 수 있습니다.

 

아래 코드는 로그 레벨에 따라 로그에 라벨링은 하는 예제입니다.

fileLoggerOpts.FormatLogEntry = (lmMsg) =>
{
    string sLevel = string.Empty;

    switch (lmMsg.LogLevel)
    {
        case LogLevel.Information:
            sLevel = "Info";
            break;
        case LogLevel.Warning:
            sLevel = "Warn";
            break;

        default:
            sLevel = lmMsg.LogLevel.ToString();
            break;
    }

    return $"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}] {sLevel} [{lmMsg.LogName}] {lmMsg.Message}";
};

 

 

마무리

 참고 : github - dang-gun/DotNetSamples/LoggingNReco_Aspnet/

 

MS에서 왜 기본 로그 파일 출력을 더 이상 지원하지 않는지는 모르겠습니다.

복잡한 기능은 몰라도 단순 출력이면 난이도가 높은것도 아닌데 말이죠....