이번 포스팅에서는 ASP.NET 웹 프로그램에서 log4net 을 추가하고 사용하기 위한 방법을 소개합니다.
log4net 소개
log4net은 Apache Software Foundation에서 관리하는 오픈 소스 로그 프레임워크로, .NET 애플리케이션에서 효과적으로 로그를 기록하고 관리할 수 있도록 설계되었습니다. log4net은 Java 기반 로그 프레임워크인 Log4j에서 영감을 받아 만들어졌으며, .NET Framework와 .NET Core 모두에서 사용할 수 있습니다.
로그는 애플리케이션 개발 과정에서 디버깅 및 문제 해결에 중요한 역할을 합니다. log4net은 이러한 로그 관리 과정을 단순화하고, 다양한 포맷과 대상에 로그를 기록할 수 있는 기능을 제공합니다.
log4net이란 무엇인가?
log4net은 Apache에서 제공하는 .NET용 오픈 소스 로깅 라이브러리로, 다양한 출력 매체에 로그를 기록할 수 있는 강력한 기능을 제공합니다. 이 라이브러리는 ASP.NET 웹 애플리케이션 개발자들이 손쉽게 로그를 남기고 관리할 수 있도록 도와줍니다.
log4net의 주요 기능과 장점
- 다양한 로그 대상 지원
log4net은 텍스트 파일, 데이터베이스, 콘솔, 이벤트 로그, 원격 서버 등 여러 대상에 로그를 기록할 수 있습니다. - 유연한 설정 방식
XML 또는 코드 기반 설정을 통해 쉽게 로그 포맷, 레벨, 출력 방식을 커스터마이징할 수 있습니다. - 다양한 로그 레벨 제공
log4net은 다음과 같은 로그 레벨을 지원하여 상황에 맞는 적절한 로그 메시지를 기록할 수 있습니다.
- Debug: 상세한 디버깅 정보
- Info: 일반적인 정보 메시지
- Warn: 경고 메시지
- Error: 오류 메시지
- Fatal: 치명적인 오류 메시지
- Appender와 Layout의 조합 가능
log4net은 Appender와 Layout을 조합하여 로그 메시지를 원하는 형식으로 출력할 수 있습니다.
ASP.NET 에서 log4net 설치 및 설정
NuGet 패키지를 이용한 log4net 설치
- Visual Studio에서 ASP.NET 프로젝트를 만들거나 엽니다.
필자는 WebApplication1 이라는 기본 이름으로 프로젝트를 만들었습니다.
- NuGet 패키지 관리자를 열고 다음 패키지를 설치합니다.
Microsoft.Extensions.Logging.Log4Net.AspNetCore
- 설치가 완료되면 프로젝트에 log4net 참조가 추가됩니다.
log4net.xml 설정 추가하기
log4net.xml을 만들고 설정을 추가 합니다.
필자는 다음과 같이 설정하였습니다.
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<!-- Pattern to output the caller's file name and line number -->
<conversionpattern value="%d{yyyyMMddHHmmss.fff} %-5p %m%n"/>
</layout>
</appender>
<!-- WebApplication1.Controllers 네임스페이스만 로그 파일 생성 -->
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="./log/" />
<!--<rollingStyle value="Date" />-->
<datePattern value="yyyy-MM-dd.'log'" />
<appendToFile value="true" />
<staticLogFileName value="false" />
<maximumFileSize value="32MB" />
<maxSizeRollBackups value="1000" />
<encoding value="utf-8" />
<layout type="log4net.Layout.PatternLayout">
<!-- %d [%17t] %-5p %c %C %M - %m%n -->
<conversionpattern value="%d{yyyyMMdd HH:mm:ss} | %-5p %m%n">
</conversionpattern>
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="Console" />
</root>
<logger name="WebApplication1.Controllers">
<level value="ALL"/>
<appender-ref ref="RollingFile" />
</logger>
</log4net>
위 설정 파일은 WebApplication1.Controllers 네임스페이스만 파일로 로깅을 하고 나머지는 Console 로만 보여주겠다는 내용입니다.
항상 출력 폴더에 복사가 되어야 최신 버전을 유지할 수 있습니다. 위 사진과 같이 log4net.xml 을 두고 설정도 위와 같이 합니다.
log4net 사용 하기
- log4net.xml 사용하기 위하여 Program.cs 파일에 다음 구문을 추가 합니다.
var loggerFactory = app.Services.GetRequiredService<ILoggerFactory>();
loggerFactory.AddLog4Net(string.Format("{0}log4net.xml", AppDomain.CurrentDomain.BaseDirectory));
현재 실행되고 있는 폴더(AppDomain.CurrentDomain.BaseDirectory)에서 log4net.xml 을 참조하겠다는 내용입니다.
- 사용하기
아주 간단하게 설정 작업이 끝났습니다. 이제 ASP.NET 의 기본 로그시스템에 맞춰 사용하기만 하면 됩니다.
다음 메서드 등을 활용하면 됩니다.
** LogDebug(ILogger, String, Object[])
디버그 로그 메시지를 서식 지정하고 씁니다.
** LogInformation(ILogger, String, Object[])
정보 로그 메시지를 서식 지정하고 씁니다.
** LogWarning(ILogger, String, Object[])
경고 로그 메시지를 서식 지정하고 씁니다.
** LogError(ILogger, String, Object[])
오류 로그 메시지를 서식 지정하고 씁니다.
** LogCritical(ILogger, String, Object[])
중요한 로그 메시지를 서식 지정하고 씁니다.
간단히 Program.cs 과 WebApplication1.Controllers 네임스페이스의 WeatherForecastController.cs 에서 로그를 남겨 보도록 하겠습니다.
Program.cs
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
//log4net.xml 사용하기위한 Setting
var loggerFactory = app.Services.GetRequiredService<ILoggerFactory>();
loggerFactory.AddLog4Net(string.Format("{0}log4net.xml", AppDomain.CurrentDomain.BaseDirectory));
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
// Log 남기기
app.Logger.LogInformation("program.cs");
app.Run();
WeatherForecastController.cs
namespace WebApplication1.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
// WebApplication1.Controllers 에서의 로깅
_logger.LogInformation("WeatherForecastController.cs");
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}
위 두 파일에서 단지 파일명만 로깅하는 간단한 로그를 남겼습니다.
결과를 살펴보면
Console 에는 위의 두 로그가 모두 표시가 되었습니다.
실행폴더의 log 폴더에 보면 날짜별 로깅파일이 존재하며
위와 같이 로그가 남아 있게 됩니다.
log4net configuration 에 대해 자세한 문서를 원하시면 다음 링크에 포함되어 있습니다.
https://logging.apache.org/log4net/release/manual/configuration.html
결론
log4net은 강력한 기능과 유연성을 갖춘 로깅 라이브러리로, ASP.NET 개발자들에게 필수적인 도구입니다. 올바르게 설정하고 사용하면 애플리케이션 디버깅, 문제 해결, 감사 로그 관리에 큰 도움이 됩니다. 이제 log4net을 활용하여 더 안정적이고 관리하기 쉬운 웹 애플리케이션을 개발해 보세요.