C# WPF log4net 적용 – 설정 파일 사용하지 않는방법 (동적 설정)

이 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 로그를 남기는 방법을 설명 하겠습니다.

.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤