이 Post 는 C# 혹은 WPF에서 로깅을 위해 log4net 을 사용할때 설정 파일을 사용하지 않는 방법을 설명 합니다.
설정 파일을 사용하지 않음으로서 Log 파일의 위치를 유동적으로 설정 할 수 있으며, 로그 레벨도 상황에 따라 적절히 변경할 수 있습니다.
Nuget 에서 Log4net 을 프로젝트에 설치하는 과정은 동일 합니다.
이전 Post 를 참조 하시면 됩니다.
Log4net 을 설치 했으면 설정 파일은 만들지 않고, 물론 AssemblyInfo.cs 파일도 건드리지 않고 다음을 따라 합니다.
1. StLog.cs – static 공용 로그 파일 생성
internal static class StLog
{
#if DEBUG
internal static readonly Level logLevel = Level.All;
#else
internal static readonly Level logLevel = Level.Info;
#endif
internal static readonly string PgmFullPath = Assembly.GetEntryAssembly().Location;
internal static readonly string PgmFullName = Path.GetFileName(PgmFullPath);
internal static readonly string PgmName = PgmFullName.Substring(0, PgmFullName.IndexOf("."));
internal static readonly string PgmPath = PgmFullPath.Substring(0, PgmFullPath.Length - PgmFullName.Length);
internal static readonly string LogPath = PgmPath + "Log\\";
internal static readonly string LogFile = LogPath + PgmName + ".log";
private static Hierarchy hierarchy = (Hierarchy)log4net.LogManager.CreateRepository("MainRepository");
private static PatternLayout patternLayout = new PatternLayout();
private static RollingFileAppender roller = new RollingFileAppender();
static StLog()
{
InitLogger();
}
internal static void InitLogger()
{
patternLayout.ConversionPattern = "[%date][Thread : %thread][%level][%logger] %message%newline";
patternLayout.ActivateOptions();
roller.File = LogFile;
roller.DatePattern = ".yyyy-MM-dd";
roller.AppendToFile = true;
roller.RollingStyle = RollingFileAppender.RollingMode.Date;
roller.StaticLogFileName = true;
roller.Encoding = Encoding.UTF8;
roller.Layout = patternLayout;
roller.ActivateOptions();
}
internal static ILog GetLogger(Type type)
{
Logger logger = hierarchy.LoggerFactory.CreateLogger((ILoggerRepository)hierarchy, type.Name);
logger.Level = logLevel;
logger.Hierarchy = hierarchy;
logger.AddAppender(roller);
logger.Repository.Configured = true;
LogImpl logImpl = new LogImpl(logger);
return logImpl;
}
}
StLog.cs 라는 공용으로 사용할 static 로그 파일을 생성 합니다.
#if DEBUG 구분자로 Debug 모드에서만 로그 레벨을 Debug 로 하고 Release 에서는 Info 로 설정 합니다.
각 static 변수 에서는
1. 프로그램의 Full Path 를 가져오고 (파일명 포함)
2. Full Path 에서 파일명만 분리하고
3. 파일명 에서 확장자를 제거하여 프로그램 명만 가져옵니다.
4. Full Path 에서 파일명만큼 빼서 경로만 추출 합니다.
5. 그 경로에 아래 Log 경로를 만들어 로그 패스를 설정하고
6. 프로그램명 + .log 를 해서 로그파일명을 설정 합니다.
static 클래스 초기화를 통해 InitLogger 함수를 실행 합니다.
InitLogger 함수 에서는 로그를 설정 합니다.
이 부분이 log4net.config 파일을 대신 합니다.
차후 각 클래스 별로 GetLogger 를 통해 Logger 를 받아갑니다.
2. App.xaml
<!--
<Application x:Class="BlogDemo_Log4Net_DynamicConfig.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BlogDemo_Log4Net_DynamicConfig"
StartupUri="MainWindow.xaml">
-->
<Application x:Class="BlogDemo_Log4Net_DynamicConfig.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BlogDemo_Log4Net_DynamicConfig"
Startup="StartupApp">
<Application.Resources>
</Application.Resources>
</Application>
StartupUri 를 Startup 으로 변경하여 Mainwindow.xaml 을 바로 실행하지 않고 App.xaml.cs 의 StartupApp 함수에서 프로그램을 시작하도록 수정 합니다.
3. App.xaml.cs
public partial class App : Application
{
private static readonly ILog log = StLog.GetLogger(typeof(App));
private void StartupApp(object sender, StartupEventArgs e)
{
log.Debug("StartupApp Start");
try
{
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
}
catch (Exception ex)
{
log.Error(ex);
}
finally
{
log.Debug("StartupApp Finally");
}
log.Debug("StartupApp End");
}
}
3 번째 줄에서 StLog.GetLogger 를 통해 Logger 를 받아옵니다.
나머지는 log.Debug 등을 통해서 로그를 남기는 코드 입니다.
4. MainWIndow.xaml.cs
public partial class MainWindow : Window
{
private static readonly ILog log = StLog.GetLogger(typeof(MainWindow));
public MainWindow()
{
InitializeComponent();
this.Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
log.Debug("MainWindow_Loaded Start");
try
{
//do something
}
catch(Exception ex)
{
log.Error(ex);
}
finally
{
log.Debug("MainWindow_Loaded Finally");
}
log.Info("MainWindow_Loaded End");
}
5. 로그 파일

다음과 같이 로그 파일이 생성 됩니다.
6. 로그파일 내용

로그파일 내용은 다음과 같습니다.
여기까지 동적으로 log4net 을 설정하는 방법을 설명 했습니다.
이 방법을 통해
1. 상황에 따라 로그 레벨을 설정
2. 로그 경로를 동적으로 설정
할 수 있습니다.
한 가지 불편한 건 Log4j 에서 사용 가능한 Trace 나 Verbose 로그를 남길 수 없다는 겁니다.
Debug 에서도 자주 볼 필요가 없는 로그를 남길때는 유용하게 사용했었는데 말이죠.
다음 Post 에서는 Log4net 에서 Trace 나 Verbose 로그를 남기는 방법을 설명 하겠습니다.
.