라이브러리

[ log4net ]c# log4net 사용법 : 콘솔과 파일 로그 출력

code094 2022. 9. 1. 12:30

log4net 은 c# 에서 사용하는 로그 라이브러리로, 

따로 코드정리 하지 않고 log4net 을 사용해서 쉽게 로그를 남길 수 있다

log4net은 콘솔, 디비, 파일, 이메일 등 여러 곳에 로그를 출력 시킬 수 있는데 콘솔과 파일만 다뤄봄 

 

먼저, Nuget 패키지관리에서 log4net 설치! 

 

Appender 

로그 출력을 위해서 Appender로 어떤 형식(콘솔, 파일 , .. )으로 로그를 출력할지 정함

// 콘솔 출력
<appender name="Console" type="log4net.Appender.ConsoleAppender">
      
</appender>
 // 파일 출력 -> rolling file 
 <appender name="RollingfileAppender" type="log4net.Appender.RollingfileAppender">
     ...
 </appender>
 
  // 파일 출력 -> file 
 <appender name="FileAppender" type="log4net.Appender.FileAppender">
     ...
 </appender>

파일과 롤링 파일의 차이점은

롤링 파일은 파일 크기가 max 사이즈 초과 시, 자동으로 파일을 분할하지만 

파일 은 제한없이 파일 크기가 커질수도 있다

 

각 Appender 안에는 여러 옵션들을 지정 할 수 있다

파일의 경우 

<appender name = " " type = " "/>  이름과 타입 설정
<File value = " "/>    파일 경로 및 파일명   
<rollingStyle value = " "/>    size : 파일이 특정 크기 위반시 롤링 
date : 현재 날짜 기준으로 로그 파일 롤링 
composite : 크기 제한 및 현재 날짜 따라 롤링 
once  log4net 초기화 될때마다(어플 시작시) 롤링
<appendToFile value = "true" />    로그 파일 추가할지 or 덮어 쓰기 할지 
<maxSizeRollBackups value ="100"/>  최대 생성되는 파일 개수 설정 여기서는 최대 파일 개수 100개
<maximumFileSize value = "100MB"/>   파일이 100MB 를 초과하면 새 롤링 파일 만듦 
<layout type = "">
<conversionPattern value="%d %-5p - %m%n" />
</layout>   

로그에 남길 패턴을 설정한다. 

   

                 

로그 레벨

 

로그 레벨을 지정하게 되면 레벨 이상의 로그만 쓰여짐. 

(fatal > error > warn > info > debug)

Appender 안에 filter 를 이용해서 사용하면 각 레벨에 해당하는 로그 파일만 남길 수 있다. 

<filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ERROR" />
        <param name="LevelMax" value="FATAL" />
</filter>

 

결과적으로, 

ERROR 와 WARNNING 메세지만 파일형태로 로그를 남기것이고 파일이 100개 이상이 넘지 않도록  하겠다 하면 아래와 같이 작성하면 된다. 

<appender name="RollingfileAppender" type="log4net.Appender.RollingfileAppender">
      <File type="log4net.Util.PatternString" value="log/logging"/>
      <param name="AppendToFile" value="true"/>
       <datePattern value="yyyyMMdd'.log'" /> 
       <rollingStyle value="Date"/> 
       <staticLogFileName value="false"/> 
       <maxSizeRollBackups value ="100"/>
       <filter type="log4net.Filter.LevelRangeFilter">
         <param name="LevelMin" value="ERROR" />
         <param name="LevelMax" value="WARN" />
       </filter>
       <layout type="log4net.Layout.PatternLayout">
         <conversionPattern value="%message%newline" />
       </layout>
</appender>
<logger additivity="false" name="class name">
      <level value="ALL"/>
      <appender-ref ref="RollingfileAppender" />
</logger>

 콘솔 로그를 남기고 싶으면, 

 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date : %message %newline"/>
      </layout>
 </appender>
 <logger additivity="false" name="class name">
      <level value="ALL"/>
      <appender-ref ref="ConsoleAppender" />
</logger>

 한번에 콘솔과 파일 로그를 같이 남기고 싶으면, 두개다 써주면 된다 

 <logger additivity="false" name="class name">
      <level value="ALL"/>
      <appender-ref ref="ConsoleAppender" />
      <appender-ref ref="RollingfileAppender" />
</logger>

 

그리고 나서, 사용할 클래스로 가서         

LogManager.GetLogger(typeof(class명)) or 

system.Reflection.MethodBase.GetCurrentMethod().DeclaringType 로 호출하고 사용하면 됨.                                  

class Test
{
  //private static readonly ILog log = LogManager.GetLogger (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType) ;      
   private static ILog log = LogManager.GetLogger(typeof(Test));
   public Test()
   {
        ... 
        log.Error("Error log");
   }
}

또한 프로젝트에서 환경 설정 파일 읽어올 수 있도록 , 

AssemblyInfo.cs 파일에 [assembly: log4net.Config.XmlConfigurator(Watch = true)]  추가   

(App.Config 파일에 써도 되지만 log4net.Config 새로 하나 만들어서 사용)

 

출력 디렉터리에 항상 복사 옵션 설정 해 줌.                                                         

                                                             

끗