ASP.NET Core에서는 ILogger 개체를 사용해 기본 제공 로깅 기능을 사용할 수 있다. 로깅을 적용하기 위해서는 ILogger\<T> 인스턴스를 생성한다.
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
이렇게 생성된 _logger 개체로 LogInformation 메서드를 호출하면 console에 해당 로그가 기록된다.
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
_logger.LogInformation("Writing something....");
return View();
}
}
c#에서는 다양한 로깅 옵션인 ILogger, ILoggerFactory 및 ILoggerProvider를 제공한다.
ILogger 인터페이스는 ASP.NET Core에서 제공하는 가장 일반적인 로깅 인터페이스로 최소한의 종속성을 갖춘 간단한 로깅만 제공한다. 만약 로그 항목을 특정 유형과 연결하여 로깅에 대한 보다 구조화된 접근 방식을 사용하려면 위의 예제 처럼 Generic 방식을 사용한다.
ILoggerFactory는 ILogger 유형의 인스턴스를 생성하고 로깅 공급자를 등록하는 데 사용할 수 있는 팩토리 인터페이스이다.
namespace Microsoft.Extensions.Logging
{
public interface ILoggerFactory : IDisposable
{
void AddProvider(ILoggerProvider provider);
ILogger CreateLogger(string categoryName);
}
}
CreateLogger() 메서드와 AddProvider() 메서드라는 두 가지 메서드가 있고 CreateLogger() 메서드는 logger 인스턴스를 생성하는 역할을 한다. AddProvider() 메서드는 logger 팩토리에 새 공급자를 추가하는 역할을 한다.
ILoggerProvider는 ILogger 인스턴스를 생성하는 데 사용되는 인터페이스로 사용자 정의 로깅 구현이 필요하거나 타사 로깅 프레임워크와 통합하려는 경우 사용한다.
namespace Microsoft.Extensions.Logging
{
public interface ILoggerProvider : IDisposable
{
ILogger CreateLogger(string categoryName);
}
}
ASP.NET Core에는 Console Provider, Debug Provider등 내장형 Provider가 있다.
ILoggerProvider를 상속받는 CustomLoggerProvider 클래스를 작성한다.
blic class CustomLoggerProvider : ILoggerProvider
{
public ILogger CreateLogger(string categoryName)
{
return new CustomLogger();
}
public void Dispose()
{
throw new NotImplementedException();
}
}
public class CustomLogger : ILogger
{
public IDisposable BeginScope<TState>(TState state)
{
return null;
}
public bool IsEnabled(LogLevel logLevel)
{
return true;
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
{
Console.WriteLine($"[{Enum.GetName(logLevel)}]: {state}");
}
}
Program.cs에 CustomLoggerProvider 서비스를 등록한다.
builder.Logging.ClearProviders(); // 기존 Provider를 제거한다.
builder.Services.AddSingleton<ILoggerProvider, CustomLoggerProvider>();
HomeController에서 생성자 의존성 주입을 통해 CustomLoggerProvider를 통해 로깅을 한다.
public class HomeController : Controller
{
private readonly ILogger _logger;
public HomeController(ILoggerProvider loggerProvider)
{
_logger = loggerProvider.CreateLogger("HomeController");
}
public IActionResult Index()
{
_logger.Log(LogLevel.Information, "Write something....");
return View();
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
웹을 실행시키면 콘솔에 CustomLogger 클래스의 Log 메서드를 통해 기록한 로그가 기록된다.