포스트

Nuget Package, log4net

Project Structure

Nuget Package, log4net

Log 의 필요성

프로그램을 제작 시 예기치 못한 버그나 유저 마다 다른 사용 방법 등으로 인해 코드를 점검해야 하는 일을 빈번하게 발생한다. 그때마다 모든 코드를 점검하는 것은 비효율적이기 때문에 문제가 발생한 위치를 바로 알기 위해서 로그가 필요하다.

로그를 편리하게 남길 수 있도록 지원하는 Nuget Package, log4net 에 대해 알아보자

log4net Config 작성법

  1. log4net Nuget Pacakge 설치
    작성자: The Apache Software Foundation
  2. log4net.config 추가 프로젝트 - 새 항목 추가 - 어플리케이션 구성 파일
    log4net.config 이름으로 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<log4net>
		<appender name="applicationLogger" type="log4net.Appender.RollingFileAppender">
			<file type="log4net.Util.PatternString" value="logs\%date{yyyy}\%date{MM}\%date{dd}\APP_%date{yyyyM		Mdd}.log" />
			<encoding value="utf-8" />
			<appendToFile value="true" />
			<rollingStyle value="Size" />
			<maxSizeRollBackups value="100" />
			<maximumFileSize value="30MB" />
			<staticLogFileName value="true" />
			<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%d{yyyy-MM-dd HH:mm:ss.fff} :: [Thread-%t]%m%n" />
			</layout>
		</appender>

		<logger name="applicationLogger">
			<level value="INFO"/>
			<appender-ref ref="applicationLogger"/>
		</logger>
	</log4net>
</configuration>
  • appender
    • name: 코드에서 해당 이름으로 불러와 사용
    • type: RollingFileAppender → 로그를 파일로 저장하고, 용량이 넘으면 자동으로 롤링(분할) 저장함
  • file
    • type: log4net.Util.PatternString 정적인 경로가 아니라 날짜 기준으로 매일 자동 생성되는 경로, 즉 동적인 경로
    • value: 저장 경로
  • encoding: 인코딩 방식
  • ** appendToFile: 로그 작성시 이어쓰기 할지 여부 **true 일 경우: 기존 파일이 있더라도 이어쓰기 함 false일 경우: 기존 파일 삭제하고 새로 쓰기 함 (기존 로그가 삭제되는 문제가 발생할 수 있음)
  • rollingStyle / maximumFileSize / maxSizeRollBackups: 로그 파일 하나가 30MB 넘으면 새파일로 롤링 최대 100개까지 롤링 백업 유지
  • staticLogFileName: 파일 이름은 항상 고정 여부

true 일 경우

1
2
3
4
APP_20250423.log
APP_20250423.log.1
APP_20250423.log.2
...

false 일 경우

1
2
3
4
APP_20250423.log
APP_20250423_001.log
APP_202504023_002.log
...
  • conversionPattern: 로그 한줄 포맷
    • 날짜/시간
    • 스레드 ID
    • 로그 메시지

log4net.config 의 속성에서 출력 디렉토리로 복사를 “항상 복사” 로 설정

log4net 사용 전 준비

  1. 프로젝트 AssemblyInfo.cs 에 다음 내용 추가
    1
    
    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true]
    
  2. LogService Class 추가
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    public static class LogService
    {
     private static readonly ILog applicationLogger = LogManager.GetLogger("applicationLogger");
    
     public static void WriteLog(string message)
     {
         var callingMethod = new StackTrace().GetFrame(1)?.GetMethod();
         var callingMethodName = $"{callingMethod?.DeclaringType?.FullName}.{callingMethod?.Name}";
    
    
         applicationLogger.Info($"[{callingMethod}]{message}");
    //        applicationLogger.Debug($"[{callingMethod}]{message}");
    //        applicationLogger.Warn($"[{callingMethod}]{message}");
    //        applicationLogger.Error($"[{callingMethod}]{message}");
    //        applicationLogger.Fatal($"[{callingMethod}]{message}");
     }
    }
    

다른 레벨의 로그를 남기려면 log4net.config 수정이 필요하다.

로그 레벨별 의미 & 사용 기준

레벨의미언제쓰나
DEBUG개발 디버깅용 상세로그내부 값 출력, 흐름 추적, 조건확인
INFO정상 흐름 요약시작/종료, 주요 상태 변화, 사용자 액션
WARN경고 상황(실패는 아님)예외적 상황이지만 동작은 계속 될 때 (ex: 설정 누락, 재시도)
ERROR오류 발생 (기능 실패)try-catch 로 잡힌 예외, 기능 중단, DB 실패 등
FATAL치명적 오류(앱 중단급)복구 불가한 심각한 에러 → 앱 종료 or 전체 서비스 영향 시

log4net 사용하기

1
LogService.WriteLog("버튼이 눌렸습니다.");


log4net 을 이용하고 로그 기록이 정말 편해졌다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.