.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'으로도 세부 설정을 할 수 있는데
해당 자료는 많아서 이 포스팅에서는 다루지 않았습니다.