본문 바로가기

WPF/Nuget Package

[WPF - NuGet] log4net (logger) 사용하기

log4net 이란?

log4net은 Aparche Software Foundation에서 개발한 .Net에서 사용할 수 있는 Logging Framework입니다.

log4net의 특징

  • 로그를 다양한 공간(File, DB, Consol, Email 등)에 만들수 있습니다.
  • 다양한 로그(Info, Debug, Error 등)를 표현 할 수 있습니다.
  • 로그 생성 구조는 변경 하고 싶을 때에는 코드 수정없이 Config 파일만 변경하면 됩니다.

    log4net의 단점

  • Config 파일의 명령어에 오타가 있을경우 log4net이 실행되지 않습니다.
  • Config 파일의 오류를 찾기 어렵습니다.

    log4net의 기능

  • Logger : 코드상 로그를 출력하는 기능
  • Appender : Logger안에 Appender를 사용해 파일이나 DB, Console 등 여러가지에 저장할 수 있도록 설정
  • Layout : 메시지를 어떤 형태로 남길 것인지를 정의 할 수 있습니다.

log4net 구성하기

1. Nuget Package

  • log4net Nuget Package를 설치 합니다.
  • (상단) 도구 -> Nuget 패키지 관리자 -> 솔루션용 NuGet 패키지 관리에서 검색
    image

2. Config file 만들기

  • 새 항목 추가 -> 애플리케이션 구성파일 추가
  • 이름은 log4net.config 로 지정

3. Config File 구성하기

<?xml version="1.0" encoding="utf-8" ?> 
<log4net>
  <root>
    <level value ="ALL" />
    <appender-ref ref="console"/>
    <appender-ref ref="file"/>
  </root>  
  <!-- Console 저장 설정 -->
  <appender name="console" type="log4net.Appender.ConsoleAppender">
    <layout type ="log4net.Layout.PatternLayout">
      <conversionPattern value ="[%date %level] %message%exception %newline"/>
    </layout>
  </appender>  
  <!-- File 저장 설정 -->
  <appender name="file" type="log4net.Appender.RollingFileAppender">
    <file value="c:/TempLogs/log4netTestLog.log"/>
    <appendToFile value="true"/>
    <rollingStyle value="Size"/>
    <maxSizeRollBackups value ="5"/>
    <maximumFileSize value="100MB"/>
    <staticLogFileName value="true"/>
    <layout type ="log4net.Layout.PatternLayout">
      <conversionPattern value ="[%date %level] %message%exception %newline"/>
    </layout>    
  </appender>  
</log4net>

log4net Config 속성 설명

1. root : 코드상 로그를 출력하는 기능

  • level : 로그 기록 Level
    ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF
  • appender-ref ref=“속성이름” : appender 속성을 설정한 동일한 이름을 지정

    2. appender : File, Console, DB 등 Logging 대상 설정

  • type : 로그 타입
  • log4net.Appender.ConsoleAppender : Console에 Log를 표시
  • log4net.Appender.RollingFileAppender : File에 Log를 표시
  • file : 파일명 및 경로
  • appendToFile : 이어 쓰기 설정
  • maxSizeRollBackups : 백업 파일 개수 제한 (Max File 개수가 넘어가면 이전의 파일이 삭제됨)
  • maximumFileSize : 백업 파일의 크기 제한

    3. Layout : 메시지 패턴을 정의

  • conversionPattern : 로그에 쓰이는 문구 셋팅

Config 설정

  • config파일의 속성에 출력 디렉터리에 복사 => 항상 복사 로 설정

AssemblyInfo 설정

프로젝트 - Property - AssemblyInfo.cs 맨 하단에 추가
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

4. logger.cs 구성

public static class Logger
{
    static readonly ILog log =
        LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    public enum logType : ushort
    {
        Debug = 0x10,
        Info = 0x01,
        Warning = 0x02,
        Error = 0x04,
        Fatal = 0x08
    }
    private static Dictionary<logType, Action<string, Exception>> logAction =
        new Dictionary<logType, Action<string, Exception>>()
        {
        { logType.Debug,    (msg,info) => log.Debug(msg)},
        { logType.Info,     (msg,info) => log.Info(msg)},
        { logType.Warning,  (info,ex) => log.Warn(info,ex)},
        { logType.Error,    (info,ex) => log.Error(info,ex)},
        { logType.Fatal,    (info,ex) => log.Fatal(info,ex)},
        };

    public static void Log(logType type, string msg = default(string), string info = default(string), Exception ex = default(Exception))
    {
        if ((logType.Error | logType.Warning | logType.Fatal).HasFlag(type))
            //logAction[type](info, ex);
            ThreadPool.QueueUserWorkItem(tmp => logAction[type](info, ex));
        else
            //logAction[type](msg, null);
            ThreadPool.QueueUserWorkItem(tmp => logAction[type](msg, null));
    }
}

5. 실제 실행하기

XMAL

<Grid Margin="15">
    <Grid.RowDefinitions>
        <RowDefinition Height="30"/>
        <RowDefinition Height="30"/>
    </Grid.RowDefinitions>
    <TextBox x:Name="tbMessage"/>
    <StackPanel Orientation="Horizontal" Grid.Row="1">
        <Button x:Name="btnDebug" Content="Debug" Width="60" Height="25" Click="BtnDebug_Click"/>
        <Button x:Name="btnInfo" Content="Info" Width="60" Height="25" Click="BtnInfo_Click"/>
        <Button x:Name="btnWarning" Content="Warnning" Width="60" Height="25" Click="BtnWarning_Click"/>
        <Button x:Name="btnError" Content="Error" Width="60" Height="25" Click="BtnError_Click"/>
        <Button x:Name="btnfatal" Content="Fatal" Width="60" Height="25" Click="Btnfatal_Click"/>            
    </StackPanel>
</Grid>

Behind Code

private void ShowMessageLog(Logger.logType type)
{
    string msg = $"{(string.IsNullOrWhiteSpace(tbMessage.Text) ? "Hello Message" : tbMessage.Text)}";
    Logger.Log(msg: msg, type: type);
}
private void ShowExceptionMessageLog(Logger.logType type)
{
    string msg = $"{(string.IsNullOrWhiteSpace(tbMessage.Text) ? "The data is invalid! Realy!!!" : tbMessage.Text)}";
    Logger.Log(type: type, info: "Error", ex: new Exception(msg));
}
private void BtnDebug_Click(object sender, RoutedEventArgs e)
{
    ShowMessageLog(Logger.logType.Debug);
}
private void BtnInfo_Click(object sender, RoutedEventArgs e)
{
    ShowMessageLog(Logger.logType.Info);
}
private void BtnWarning_Click(object sender, RoutedEventArgs e)
{
    ShowExceptionMessageLog(Logger.logType.Warning);
}
private void BtnError_Click(object sender, RoutedEventArgs e)
{
    ShowExceptionMessageLog(Logger.logType.Error);
}
private void Btnfatal_Click(object sender, RoutedEventArgs e)
{
    ShowExceptionMessageLog(Logger.logType.Fatal);
}

결과 화면

image

'WPF > Nuget Package' 카테고리의 다른 글

[WPF - Nuget] JSON Serialize / Deserialize  (0) 2021.12.24