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 패키지 관리에서 검색
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);
}
결과 화면
'WPF > Nuget Package' 카테고리의 다른 글
[WPF - Nuget] JSON Serialize / Deserialize (0) | 2021.12.24 |
---|