.NET 기본 로거가 종속성 주입이 귀찮아서 안 쓰고 있었는데...
장기적으로 봤을 때 'log4net'이 더 관리하기 힘는 거 같아서 이번 기회에 바꿔봤습니다 ㅎㅎㅎ
'ASP.NET Core'는 종속성 구성이 되어 있으므로 이 포스팅은 간단한 구현을 위해 'ASP.NET Core'를 이용합니다.
다른 플랫폼별로 따로 포스팅할 예정입니다.
종속성에 로거가 포함되어 있으므로 컨트롤러에서 로거를 전달받아 사용하면 됩니다.
[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;
}
종속성을 전달받을 수 없는 경우
1) 전역변수에 로거팩토리(ILoggerFactory)를 저장해 두고
2) 이 로거팩토리를 이용해 로그를 남기면 됩니다.
전역변수는 다음과 같이 선언했습니다.
public class GlobalStatic
{
/// <summary>
/// 로거 팩토리
/// </summary>
public static ILoggerFactory? LoggerFactory;
}
'StartUp.cs'를 사용하지 않는 경우라면 생성한 'WebApplication'개체에서 'ILoggerFactory' 서비스를 찾아야 합니다.
var app = builder.Build();
//로거팩토리 백업
GlobalStatic.LoggerFactory
= app.Services.GetRequiredService<ILoggerFactory>();
'StartUp.cs'가 있다면 'Configure'에서 종속성을 전달받아 저장하면 됩니다.
public void Configure(
IApplicationBuilder app
, IWebHostEnvironment env
, ILoggerFactory loggerFactory)
{
GlobalStatic.LoggerFactory = loggerFactory;
... 중략 ...
}
'ILoggerFactory'로 로그를 남기려면 카테고리를 생성하고 로그를 남겨야 합니다.
종속성이 주입되면 이 단계가 생략됩니다만
전역 로거의 경우 그때그때 생성하거나 전역변수에 저장할 때 생성해 두는 것이 좋습니다.
if(null != GlobalStatic.LoggerFactory)
{
GlobalStatic.LoggerFactory
.CreateLogger("GlobalStatic")
.LogInformation(sMessage);
}
위 세팅을 하면 'Information'이상의 로그만 표시됩니다.
MS Learn에서는 아래 코드를 통해 '기본 로그 수준(MinimumLevel)'을 수정하라고 되어 있습니다.
(참고 : MS Learn - .NET Core 및 ASP.NET Core 로그인)
var builder = WebApplication.CreateBuilder();
builder.Logging.SetMinimumLevel(LogLevel.Warning);
이유는 모르겠지만 저는 동작하지 않았습니다.
그래서 아래와 같이 필터를 수정했습니다.
그래서 '필터 함수'를 수정하였습니다.
(참고 : MS Learn - .NET Core 및 ASP.NET Core 로그인)
var builder = WebApplication.CreateBuilder();
builder.Logging.AddFilter((provider, category, logLevel) =>
{
return true;
});
이렇게 수정하면 모든 로그가 표시됩니다.
기본 로그 수준을 수정하는 건 호스트가 빌드되기전에 해야 하므로
'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();
}
아무 설정도 하지 않으면 콘솔에 시간이 표시되지 않습니다.
콘솔에 시간을 표시하려면 ' AddSimpleConsole'를 설정해야 합니다.
'ILoggingBuilder'빌더에서 추가해야 하므로 ' 4. 디버그 로그도 표시'와 같은 위치의 코드를 수정합니다.
다음과 같이 사용합니다.
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;
});
'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'으로도 세부 설정을 할 수 있는데
해당 자료는 많아서 이 포스팅에서는 다루지 않았습니다.