ASP.NET 웹 애플리케이션에서 log4net 사용하기

이번 포스팅에서는 ASP.NET 웹 프로그램에서 log4net 을 추가하고 사용하기 위한 방법을 소개합니다.

log4net 소개

log4net은 Apache Software Foundation에서 관리하는 오픈 소스 로그 프레임워크로, .NET 애플리케이션에서 효과적으로 로그를 기록하고 관리할 수 있도록 설계되었습니다. log4net은 Java 기반 로그 프레임워크인 Log4j에서 영감을 받아 만들어졌으며, .NET Framework와 .NET Core 모두에서 사용할 수 있습니다.

로그는 애플리케이션 개발 과정에서 디버깅 및 문제 해결에 중요한 역할을 합니다. log4net은 이러한 로그 관리 과정을 단순화하고, 다양한 포맷과 대상에 로그를 기록할 수 있는 기능을 제공합니다.

log4net이란 무엇인가?

log4net은 Apache에서 제공하는 .NET용 오픈 소스 로깅 라이브러리로, 다양한 출력 매체에 로그를 기록할 수 있는 강력한 기능을 제공합니다. 이 라이브러리는 ASP.NET 웹 애플리케이션 개발자들이 손쉽게 로그를 남기고 관리할 수 있도록 도와줍니다.

log4net의 주요 기능과 장점

  1. 다양한 로그 대상 지원
    log4net은 텍스트 파일, 데이터베이스, 콘솔, 이벤트 로그, 원격 서버 등 여러 대상에 로그를 기록할 수 있습니다.
  2. 유연한 설정 방식
    XML 또는 코드 기반 설정을 통해 쉽게 로그 포맷, 레벨, 출력 방식을 커스터마이징할 수 있습니다.
  3. 다양한 로그 레벨 제공
    log4net은 다음과 같은 로그 레벨을 지원하여 상황에 맞는 적절한 로그 메시지를 기록할 수 있습니다.
  • Debug: 상세한 디버깅 정보
  • Info: 일반적인 정보 메시지
  • Warn: 경고 메시지
  • Error: 오류 메시지
  • Fatal: 치명적인 오류 메시지
  1. Appender와 Layout의 조합 가능
    log4net은 Appender와 Layout을 조합하여 로그 메시지를 원하는 형식으로 출력할 수 있습니다.

ASP.NET 에서 log4net 설치 및 설정

NuGet 패키지를 이용한 log4net 설치

  1. Visual Studio에서 ASP.NET 프로젝트를 만들거나 엽니다.
    필자는 WebApplication1 이라는 기본 이름으로 프로젝트를 만들었습니다.
ASP.NET 웹 애플리케이션에서 log4net 사용하기
  1. NuGet 패키지 관리자를 열고 다음 패키지를 설치합니다.
   Microsoft.Extensions.Logging.Log4Net.AspNetCore
ASP.NET 웹 애플리케이션에서 log4net 사용하기
  1. 설치가 완료되면 프로젝트에 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 로만 보여주겠다는 내용입니다.

ASP.NET 웹 애플리케이션에서 log4net 사용하기

항상 출력 폴더에 복사가 되어야 최신 버전을 유지할 수 있습니다. 위 사진과 같이 log4net.xml 을 두고 설정도 위와 같이 합니다.

log4net 사용 하기

  1. 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 을 참조하겠다는 내용입니다.

  1. 사용하기
    아주 간단하게 설정 작업이 끝났습니다. 이제 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();
        }
    }
}

위 두 파일에서 단지 파일명만 로깅하는 간단한 로그를 남겼습니다.
결과를 살펴보면

ASP.NET 웹 애플리케이션에서 log4net 사용하기

Console 에는 위의 두 로그가 모두 표시가 되었습니다.

실행폴더의 log 폴더에 보면 날짜별 로깅파일이 존재하며

ASP.NET 웹 애플리케이션에서 log4net 사용하기

위와 같이 로그가 남아 있게 됩니다.

log4net configuration 에 대해 자세한 문서를 원하시면 다음 링크에 포함되어 있습니다.

https://logging.apache.org/log4net/release/manual/configuration.html

결론

log4net은 강력한 기능과 유연성을 갖춘 로깅 라이브러리로, ASP.NET 개발자들에게 필수적인 도구입니다. 올바르게 설정하고 사용하면 애플리케이션 디버깅, 문제 해결, 감사 로그 관리에 큰 도움이 됩니다. 이제 log4net을 활용하여 더 안정적이고 관리하기 쉬운 웹 애플리케이션을 개발해 보세요.

Leave a Comment