log4net 이란

아파치의 오픈소스 로그 라이브러리로 Java, C++, .NET 등 다양한 언어와 플랫폼을 지원하는 로그 라이브러리의 .NET 버전이다. 로그를 파일, 콘솔화면, DB로 출력할 수 있고 또 날짜, 파일 크기마다 로그를 새로 생성하도록 할 수 있다.

 

 

 

.NET에서 사용하기

.NET의 경우 NuGet을 사용하여 설치한다.

 

NuGet을 사용하여 log4net 라이브러리를 설치하면 아래 그림처럼 자동으로 프로젝트에 설정된다.

 

위 상태에서 빌드를 한다. 실행 파일이 있는 위치에 log4net 관련 dll와 xml 파일이 있다.

 

NuGet으로 설치한 경우 log4net 관련 설정 정보는 app.config 에 기록한다.

 

로그가 남도록 하면 아래와 같이 로그 파일이 생겨진다.

 

프로그램 실행 도중 로그 설정 파일을 변경하여 적용하기 위해서는 아래 처럼 AssemblyInfo.cs에 [assembly: log4net.Config.XmlConfigurator(Watch = true)] 을 추가한다.

 

 

로그 설정 정보가 있는 app.confog의 예

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<startup>

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />

</startup>

 

<log4net>

<!-- 파일을 사용하는 Appender -->

<appender name="LogToFile" type="log4net.Appender.FileAppender" >

<!-- 만들 로그 파일 -->

<param name="File" value="log-file.txt" />

<!-- 기존에 로그 파일이 있다면 연결해서 사용 여부 -->

<param name="AppendToFile" value="true" />

<!-- 로그 형식 -->

<layout type="log4net.Layout.PatternLayout">

<param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline" />

</layout>

</appender>

 

 

<!-- 날짜 단위로 Rolling 하는 파일 Appender -->

<appender name="DayRollingLogToFile" type="log4net.Appender.RollingFileAppender">

<!-- 로그 파일 이름의 선두 부분 -->

<File value="LogSample" />

<!-- 기존에 로그 파일이 있다면 연결해서 사용 여부 -->

<appendToFile value="true" />

<!-- 날짜 마다 파일을 작성하는 것을 지정 -->

<rollingStyle value="date" />

<!-- 로그 파일 이름 고정 여부. 고정하지 않을 때는 false -->

<staticLogFileName value="false" />

<!-- 파일 이름에의 날짜 부분 -->

<datePattern value='"."yyyyMMdd".log"' />

 

          

<layout type="log4net.Layout.PatternLayout">

<!-- 로그 형식 -->

<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />

</layout>

</appender>

 

 

<!-- 파일 크기 단위로 Rolling 하는 파일 Appender -->

<appender name="SizeRollingLogToFile" type="log4net.Appender.RollingFileAppender">

<file value="mylogfile.txt" />

<appendToFile value="true" />

<rollingStyle value="Size" />

<maxSizeRollBackups value="5" />

<maximumFileSize value="10MB" />

<staticLogFileName value="true" />

<layout type="log4net.Layout.PatternLayout">

<conversionPattern value="%date [%thread] %level %logger - %message%newline" />

</layout>

</appender>

 

      

<!-- 콘솔을 사용하는 Appender -->

<appender name="LogToConsole" type="log4net.Appender.ConsoleAppender">

<layout type="log4net.Layout.PatternLayout">

<conversionPattern value="%date{ABSOLUTE} [%thread] %level %logger - %message%newline"/>

</layout>

</appender>

 

 

<root>

<!-- 로그 레벨 지정. 아래에서는 INFO 레벨 이상만 로그가 남는다 -->

<level value="INFO" />

<!-- 아래 로그 레벨 중 하나 선택

<level value="OFF " />

<level value="FATAL" />

<level value="ERROR" />

<level value="WARN" />

<level value="INFO" />

<level value="DEBUG" />

<level value="ALL" />

-->

 

<!-- 어느 로그를 사용할 것인지 지정한다. 현재 파일로그와 날짜별 로그 사용 -->

<appender-ref ref="LogToFile" />

<appender-ref ref="DayRollingLogToFile" />

<!-- 복수 지정 가능 -->

</root>

</log4net>

 

</configuration>

   

 

예제 소스 코드

public partial class Form1 : Form

{

private static readonly log4net.ILog log =

 

log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

 

 

public Form1()

{

InitializeComponent();

}

 

private void button1_Click(object sender, EventArgs e)

{

log.Info("INFO 출력");

log.Debug("Debug 출력");

log.Error("Error 출력");

}

}

       

 

로그 정보에 로그를 남기는 코드 부분의 파일명이나 위치를 남기고 싶은 경우

로그 형식에 %location 을 사용한다.

<param name="ConversionPattern" value="%date [%thread] %-5level %logger - %location %message%newline" />

   

로그 파일을 특정 폴더에 남기고 싶은경우

현재 실행 파일이 있는 폴더의 Logs 폴더에 남기고 싶은 경우

<log4net>

<!--날짜 단위로 Rolling 하는 파일 Appender-->

<appender name="DayRollingLogToFile" type="log4net.Appender.RollingFileAppender">

<!--로그 파일 이름의 선두 부분-->

<File value="Logs\GameLog" />

   

 

로그 설정 정보를 app.config 파일 이외의 파일에 남기고 싶을 때

'AssemblyInfo.cs' 파일에 아래의 코드를 입력한다

    

[assembly: log4net.Config.DOMConfigurator(ConfigFile = "../../log4net.xml", Watch = true)]

또는

 

// 로그 설정 파일 로딩 후 적용

string logFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net_config.xml");

var finfo = new System.IO.FileInfo(logFilePath);

log4net.Config.XmlConfigurator.ConfigureAndWatch(finfo);

logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

 

    

nunit에서 사용할 때 동작하지 않는 경우

Log4Net.config 파일을 만들어서 아래와 같이 만든다.

    

<?xml version="1.0" encoding="utf-8" ?>

<log4net>

    <!-- 필요한 설정 정보 입력 -->

</log4net>

 

소스에서 위에서 만든 설정 파일을 사용하도록 한다.

[SetUp]

public void RunBeforeAnyTests()

{

string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log4Net.config");

FileInfo finfo = new FileInfo(logFilePath);

log4net.Config.XmlConfigurator.ConfigureAndWatch(finfo);

}

 

    

로그를 메일로 보내기

로그 설정 파일에서 log4net.Appender.SmtpAppender 를 사용한다.

보낼 메일의 문지 인코딩은 UTF-8을 사용한다.

로그 메시지 하나마다 메일을 보내는 것이 아니고 하나의 메일에는 복수의 로그 메시지가 있다.

설정 예 

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">

<!-- 메일을 받을 곳의 주소 -->

<to value="to@domain.com" />

 

<!-- 메일을 보내는 곳의 주소 -->

<from value="from@domain.com" />

 

<!-- 제목 -->

<subject value="test logging message" />

 

<!-- 메일 서버 정보 -->

<smtpHost value="SMTPServer.domain.com" />

 

<!-- 메일을 보낼 때의 버퍼 사이즈 -->

<bufferSize value="512" />

<lossy value="true" />

<evaluator type="log4net.Core.LevelEvaluator">

<threshold value="WARN"/>

</evaluator>

 

 

<layout type="log4net.Layout.PatternLayout">

<conversionPattern value="%newline%date [%thread] %-5level %logger - %message%newline" />

</layout>

</appender>

   

 

Filter

특정 appender에서만 로그 레벨을 바꾸고 싶은 경우 <appender> 요소 내에서 <filter> 요소를 추가하여 조정할 수 있다.

로그 레벨을 FATAL 때만 남기고 싶다면 다음과 같이 한다.    

<filter type="log4net.Filter.LevelRangeFilter">

<param name="LevelMin" value="FATAL" />

<param name="LevelMax" value="FATAL" />

</filter>

   

 

로그 파일 로테이션 시 파일크기+날짜 사용하기

<appender name="debugAppender" type="log4net.Appender.RollingFileAppender">

<filter type="log4net.Filter.LevelMatchFilter">

<levelToMatch value="DEBUG" />

</filter>

<filter type="log4net.Filter.DenyAllFilter" />

<File value="Logs\debug.log" />

<PreserveLogFileNameExtension value="true" />

<appendToFile value="true" />

<rollingStyle value="Composite" />

<maximumFileSize value="32MB" />

 

 

로그 파일 이름에 날짜 붙이기

<File value="Logs\perf_.log" />

<staticLogFileName value="false" />

<datePattern value="yyyyMMdd-HHmm" />

 

perf_20140601-1140.log 라는 식으로 로그 파일이 만들어진다.



같은 로그 파일 이름이 있으면 일련 번호 붙이기

파일 사이즈 및 날짜로 로그 파일을 로테이션 할 때 새로 만드는 파일 이름이 이전과 같은 이름이 되어버려서 이전 것을 덮어 쓸 수 있다.

예를들면 파일 사이즈가 설정 값을 넘겨서 새로 만드는데 이전까지 사용한 로그 파일의 생성 날짜가 같은 날이면 지금 새로 만드는 것도 같은 이름이 되어 버린다.

이유는 파일 이름 규칙이 'xx-날짜.log'로 했기 때문이다.

이름 중복을 피하기 위해서 로그 파일 이름에 일련 번호를 붙이도록 한다.

CountDirection 설정을 사용한다. 사용 방법은 아래와 같다.

<File value="Logs\perf_.log" />

<CountDirection value="1" />

이후 로테이션으로 새로 파일을 만들 때 파일 이름이 다음처러 만들어진다.

info_20140612.1.log

info_20140612.2.log

 


로그 파일 개수 제한

생성된 로그 파일의 최대 개수를 제한 할 수 있다.

<maxSizeRollBackups value="10" />

   

 

서식 타입

%literal 리터럴을 표시(「%」을 출력하는 경우 등)

%newline 개행

%logger logger 이름

%class 클래스 이름

%date 실행 시간

%exception 예외 정보

%location 메소드 이름, 행 번호

%line 행 번호

%message 메시지

%method 메소드 이름

%level 로그 레벨

%thread 스레드 ID

%appdomain 실행 파일 이름

%identity 현재 컨텍스트의 유저 이름

            (System.Threading.Thread.CurrentPrincipal.Identity.Name 의 값이 설정 되어 있다.)

%username 유저 이름

 

 

 

 

 

웹 정보

Log4Net 간단 사용법(Web 포함) http://mvcp.tistory.com/404

log4net을 사용해 보자 http://nalra999.blog.me/110095620129

[ASP.NET] log4net의 설정과 사용법 예제 http://oneprimary.blog.me/30076001926

Apache log4net™ Config Examples http://logging.apache.org/log4net/release/config-examples.html    

신고
by 흥배 2014.06.13 08:00


Log4netTest.zip

log4net 이란

아파치의 오픈소스 로그 라이브러리로 Java, C++, .NET 다양한 언어와 플랫폼을 지원하는 로그 라이브러리의 .NET 버전이다. 로그를 파일, 콘솔화면, DB 출력할 있고 날짜, 파일 크기마다 로그를 새로 생성하도록 있다.

 

.NET에서 사용하기

  • .NET 경우 NuGet 사용하여 설치한다.

 

  • NuGet 사용하여 log4net 라이브러리를 설치하면 아래 그림처럼 자동으로 프로젝트에 설정된다.

 

  • 상태에서 빌드를 한다. 실행 파일이 있는 위치에 log4net 관련 dll xml 파일이 있다.

 

  • NuGet으로 설치한 경우 log4net 관련 설정 정보는 app.config 기록한다.

 

  • 로그가 남도록 하면 아래와 같이 로그 파일이 생겨진다.

 

  • 프로그램 실행 도중 로그 설정 파일을 변경하여 적용하기 위해서는 아래 처럼 AssemblyInfo.cs [assembly: log4net.Config.XmlConfigurator(Watch = true)] 추가한다.

 

  • 로그 설정 정보가 있는 app.confog

 

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <startup>

        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />

    </startup>

   

    <log4net>

      <!-- 파일을 사용하는 Appender -->

      <appender name="LogToFile" type="log4net.Appender.FileAppender" >

   

        <!-- 만들 로그 파일 -->

        <param name="File" value="log-file.txt" />

        <!-- 기존에 로그 파일이 있다면 연결해서 사용 여부 -->

        <param name="AppendToFile" value="true" />

        <!-- 로그 형식 -->

        <layout type="log4net.Layout.PatternLayout">

          <param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline" />

        </layout>

      </appender>

   

      <!-- 날짜 단위로 Rolling 하는 파일 Appender -->

      <appender name="DayRollingLogToFile" type="log4net.Appender.RollingFileAppender">

        <!-- 로그 파일 이름의 선두 부분 -->

        <File value="LogSample" />

        <!-- 기존에 로그 파일이 있다면 연결해서 사용 여부 -->

        <appendToFile value="true" />

        <!-- 날짜 마다 파일을 작성하는 것을 지정 -->

        <rollingStyle value="date" />

        <!-- 로그 파일 이름 고정 여부. 고정하지 않을 때는 false -->

        <staticLogFileName value="false" />

        <!-- 파일 이름에의 날짜 부분 -->

        <datePattern value='"."yyyyMMdd".log"' />

   

        <layout type="log4net.Layout.PatternLayout">

          <!-- 로그 형식 -->

          <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />

        </layout>

      </appender>

   

      <!-- 파일 크기 단위로 Rolling 하는 파일 Appender -->

      <appender name="SizeRollingLogToFile" type="log4net.Appender.RollingFileAppender">

        <file value="mylogfile.txt" />

        <appendToFile value="true" />

        <rollingStyle value="Size" />

        <maxSizeRollBackups value="5" />

        <maximumFileSize value="10MB" />

        <staticLogFileName value="true" />

        <layout type="log4net.Layout.PatternLayout">

          <conversionPattern value="%date [%thread] %level %logger - %message%newline" />

        </layout>

      </appender>

   

      <!-- 콘솔을 사용하는 Appender -->

      <appender name="LogToConsole" type="log4net.Appender.ConsoleAppender">

        <layout type="log4net.Layout.PatternLayout">

          <conversionPattern value="%date{ABSOLUTE} [%thread] %level %logger - %message%newline"/>

        </layout>

      </appender>

   

      <root>

        <!-- 로그 레벨 지정. 아래에서는 INFO 레벨 이상만 로그가 남는다 -->

        <level value="INFO" />

        <!-- 아래 로그 레벨 중 하나 선택

        <level value="OFF " />

        <level value="FATAL" />

        <level value="ERROR" />

        <level value="WARN" />

        <level value="INFO" />

        <level value="DEBUG" />

        <level value="ALL" />

        -->

        <!-- 어느 로그를 사용할 것인지 지정한다. 현재 파일로그와 날짜별 로그 사용 -->

        <appender-ref ref="LogToFile" />

        <appender-ref ref="DayRollingLogToFile" />

        <!-- 복수 지정 가능 -->

      </root>

    </log4net>

     

</configuration>

 

  • 예제 소스 코드

 

public partial class Form1 : Form

{

   private static readonly log4net.ILog log =

   log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

   

   public Form1()

   {

       InitializeComponent();

   }

   

   private void button1_Click(object sender, EventArgs e)

   {

       log.Info("INFO 출력");

       log.Debug("Debug 출력");

       log.Error("Error 출력");

   }

}

  

 

로그 정보에 로그를 남기는 코드 부분의 파일명이나 위치를 남기고 싶은 경우

로그 형식에 %location 사용한다.

 

<param name="ConversionPattern" value="%date [%thread] %-5level %logger - %location %message%newline" />

  • 로그 파일을 특정 폴더에 남기고 싶은경우

  • 현재 실행 파일이 있는 폴더의 Logs 폴더에 남기고 싶은 경우

 

<log4net>

    <!--날짜 단위로 Rolling 하는 파일 Appender-->

    <appender name="DayRollingLogToFile" type="log4net.Appender.RollingFileAppender">

      <!--로그 파일 이름의 선두 부분-->

      <File value="Logs\GameLog" />

 

로그 설정 정보를 app.config 파일 이외의 파일에 남기고 싶을

'AssemblyInfo.cs' 파일에 아래의 코드를 입력한다

 

[assembly: log4net.Config.DOMConfigurator(ConfigFile = "../../log4net.xml", Watch = true)]

또는

 

// 로그 설정 파일 로딩 후 적용

string logFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net_config.xml");

var finfo = new System.IO.FileInfo(logFilePath);

log4net.Config.XmlConfigurator.ConfigureAndWatch(finfo);

logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

 

nunit에서 사용할 동작하지 않는 경우

Log4Net.config 파일을 만들어서 아래와 같이 만든다.

 

<?xml version="1.0" encoding="utf-8" ?>

<log4net>

<!-- 필요한 설정 정보 입력 -->

</log4net>

소스에서 위에서 만든 설정 파일을 사용하도록 한다.

 

[SetUp]

public void RunBeforeAnyTests()

{

    string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log4Net.config");

    FileInfo finfo = new FileInfo(logFilePath);

    log4net.Config.XmlConfigurator.ConfigureAndWatch(finfo);

}

 

로그를 메일로 보내기

  • 로그 설정 파일에서 log4net.Appender.SmtpAppender 사용한다.

  • 보낼 메일의 문지 인코딩은 UTF-8 사용한다.

  • 로그 메시지 하나마다 메일을 보내는 것이 아니고 하나의 메일에는 복수의 로그 메시지가 있다.

  • 설정

 

 

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">

   

  <!-- 메일을 받을 곳의 주소 -->

  <to value="to@domain.com" />

   

  <!-- 메일을 보내는 곳의 주소 -->

  <from value="from@domain.com" />

   

  <!-- 제목 -->

  <subject value="test logging message" />

   

  <!-- 메일 서버 정보 -->

  <smtpHost value="SMTPServer.domain.com" />

   

  <!-- 메일을 보낼 때의 버퍼 사이즈 -->

  <bufferSize value="512" />

  <lossy value="true" />

  <evaluator type="log4net.Core.LevelEvaluator">

    <threshold value="WARN"/>

  </evaluator>

   

  <layout type="log4net.Layout.PatternLayout">

    <conversionPattern value="%newline%date [%thread] %-5level %logger - %message%newline" />

  </layout>

</appender>

 

Filter

  • 특정 appender에서만 로그 레벨을 바꾸고 싶은 경우 <appender> 요소 내에서 <filter> 요소를 추가하여 조정할 있다.
  • 로그 레벨을 FATAL 때만 남기고 싶다면 다음과 같이 한다.

 

<filter type="log4net.Filter.LevelRangeFilter">

  <param name="LevelMin" value="FATAL" />

  <param name="LevelMax" value="FATAL" />

</filter>

 

로그 파일 로테이션 시 파일크기+날짜 사용하기

<appender name="debugAppender" type="log4net.Appender.RollingFileAppender">

        <filter type="log4net.Filter.LevelMatchFilter">

            <levelToMatch value="DEBUG" />

        </filter>

        <filter type="log4net.Filter.DenyAllFilter" />

        <File value="Logs\debug.log" />

        <PreserveLogFileNameExtension value="true" />

        <appendToFile value="true" />

        <rollingStyle value="Composite" />

        <maximumFileSize value="32MB" />



로그 파일 이름에 날짜 붙이기

<File value="Logs\perf_.log" />

<staticLogFileName value="false" />

<datePattern value="yyyyMMdd-HHmm" />


perf_201406011140.log 라는 식으로 로그 파일이 만들어진다.



로그 파일 개수 제한

생성된 로그 파일의 최대 개수를 제한 할 수 있다.

<maxSizeRollBackups value="10" />



서식 타입

%literal 리터럴을 표시(「%」을 출력하는 경우 등)

%newline 개행

%logger logger 이름

%class 클래스 이름

%date 실행 시간

%exception 예외 정보

%location 메소드 이름, 행 번호

%line 행 번호

%message 메시지

%method 메소드 이름

%level 로그 레벨

%thread 스레드 ID

%appdomain 실행 파일 이름

%identity 현재 컨텍스트의 유저 이름

(System.Threading.Thread.CurrentPrincipal.Identity.Name 의 값이 설정 되어 있다.)

%username 유저 이름



정보

Log4Net 간단 사용법(Web 포함http://mvcp.tistory.com/404

log4net 사용해 보자 http://nalra999.blog.me/110095620129

[ASP.NET] log4net 설정과 사용법 예제 http://oneprimary.blog.me/30076001926

Apache log4net™ Config Examples   http://logging.apache.org/log4net/release/config-examples.html

신고
by 흥배 2014.01.14 08:00
| 1 |

티스토리 툴바