2023. 10. 11. 15:30

.NET 기본 로거가  종속성 주입이 귀찮아서 안 쓰고 있었는데...

장기적으로 봤을 때 'log4net'이 더 관리하기 힘는 거 같아서 이번 기회에 바꿔봤습니다 ㅎㅎㅎ

 

'ASP.NET Core'는 종속성 구성이 되어 있으므로 이 포스팅은 간단한 구현을 위해 'ASP.NET Core'를 이용합니다.

다른 플랫폼별로 따로 포스팅할 예정입니다.

 

연관글 영역

 

 

1. 로거(logger) 사용하기 

종속성에 로거가 포함되어 있으므로 컨트롤러에서 로거를 전달받아 사용하면 됩니다.

[Route("api/[controller]/[action]")]
[ApiController]
public class TestController : ControllerBase
{
/// <summary>
/// 사용할 로거
/// </summary>
private ILogger _logger;

public TestController(ILogger<TestController> logger)
{
    this._logger = logger;
}

/// <summary>
/// 무조건 성공
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult SuccessCall()
{
    ObjectResult apiresult = new ObjectResult(200);

    apiresult = StatusCode(200, "성공!");

    this._logger.LogInformation("SuccessCall에서 호출~");
    return apiresult;
}

/// <summary>
/// 무조건 성공2
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult SuccessCall2()
{
    ObjectResult apiresult = new ObjectResult(200);

    apiresult = StatusCode(200, "성공!");
    this._logger.LogInformation("SuccessCall2에서 호출!!!");

    return apiresult;
}

 

2. 전역 로거 생성 

종속성을 전달받을 수 없는 경우

1) 전역변수에 로거팩토리(ILoggerFactory)를 저장해 두고

2) 이 로거팩토리를 이용해 로그를 남기면 됩니다.

 

전역변수는 다음과 같이 선언했습니다.

public class GlobalStatic
{
    /// <summary>
    /// 로거 팩토리
    /// </summary>
    public static ILoggerFactory? LoggerFactory;
}

 

 

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

'StartUp.cs'를 사용하지 않는 경우라면 생성한 'WebApplication'개체에서 'ILoggerFactory' 서비스를 찾아야 합니다.

var app = builder.Build();

//로거팩토리 백업
GlobalStatic.LoggerFactory 
    = app.Services.GetRequiredService<ILoggerFactory>();

 

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

'StartUp.cs'가 있다면 'Configure'에서 종속성을 전달받아 저장하면 됩니다.

public void Configure(
    IApplicationBuilder app
    , IWebHostEnvironment env
    , ILoggerFactory loggerFactory)
{

    GlobalStatic.LoggerFactory = loggerFactory;
    
    ... 중략 ...
}

 

 

3. 전역 로거 이용 

'ILoggerFactory'로 로그를 남기려면 카테고리를 생성하고 로그를 남겨야 합니다.

종속성이 주입되면 이 단계가 생략됩니다만

전역 로거의 경우 그때그때 생성하거나 전역변수에 저장할 때 생성해 두는 것이 좋습니다.

if(null != GlobalStatic.LoggerFactory)
{
    GlobalStatic.LoggerFactory
        .CreateLogger("GlobalStatic")
        .LogInformation(sMessage);
}

 

 

4. 디버그 로그도 표시 

위 세팅을 하면 'Information'이상의 로그만 표시됩니다.

 

MS Learn에서는 아래 코드를 통해 '기본 로그 수준(MinimumLevel)'을 수정하라고 되어 있습니다.

(참고 : MS Learn - .NET Core 및 ASP.NET Core 로그인)

var builder = WebApplication.CreateBuilder();
builder.Logging.SetMinimumLevel(LogLevel.Warning);

 

이유는 모르겠지만 저는 동작하지 않았습니다.

그래서 아래와 같이 필터를 수정했습니다.

 

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

그래서 '필터 함수'를 수정하였습니다.

(참고 : MS Learn - .NET Core 및 ASP.NET Core 로그인)

var builder = WebApplication.CreateBuilder();
builder.Logging.AddFilter((provider, category, logLevel) =>
{
    return true;
});

이렇게 수정하면 모든 로그가 표시됩니다.

 

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

기본 로그 수준을 수정하는 건 호스트가 빌드되기전에 해야 하므로  

'StartUp.cs'를 사용하는 경우라면 'Program.cs'를 수정해야 합니다.

 

보통은 아래와 같이 'Main' 함수가 구현되어 있을 겁니다.

public static void Main(string[] args)
{
    Host.CreateDefaultBuilder(args).Build().Run();
}

 

이걸 아래와 같이 바꿔줍니다.

public static void Main(string[] args)
{
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logbuilder => 
        {
            logbuilder.AddFilter((provider, category, logLevel) =>
            {
                return true;
            }); 
        })
        .Build().Run();
}

 

 

5. 시간 표시 

아무 설정도 하지 않으면 콘솔에 시간이 표시되지 않습니다.

콘솔에 시간을 표시하려면 ' AddSimpleConsole'를 설정해야 합니다.

 

'ILoggingBuilder'빌더에서 추가해야 하므로 ' 4. 디버그 로그도 표시'와 같은 위치의 코드를 수정합니다.

 

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

다음과 같이 사용합니다.

builder.Logging
    .AddSimpleConsole(c => c.TimestampFormat = "[yyyy-MM-dd HH:mm:ss] ")

 

다른 설정도 뒤에 붙여서 사용하는 것이 가능합니다.

builder.Logging
    .AddSimpleConsole(c => c.TimestampFormat = "[yyyy-MM-dd HH:mm:ss] ")
    .AddFilter((provider, category, logLevel) =>
{
    return true;
});

 

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

'Program.cs'에서 다음과 같이 작성합니다.

public static void Main(string[] args)
{
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logbuilder =>
        {
            logbuilder.AddSimpleConsole(c => c.TimestampFormat = "[yyyy-MM-dd HH:mm:ss] ");
        })
        .Build().Run();
}

 

 

마무리

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

종속성 주입 때문에 좀 번거로운 게 있긴 하지만 이것도 클래스를 하나 만들어서 처리하면  'log4net'보다 더 편한 게 사실입니다.

 

ASP.NET의 경우 'appsettings.json'으로도 세부 설정을 할 수 있는데

해당 자료는 많아서 이 포스팅에서는 다루지 않았습니다.