관리 메뉴

KorSA

C# log4net을 XML 대신 코드로 사용하기 본문

Development Experience/C#

C# log4net을 XML 대신 코드로 사용하기

Praiv. 2021. 8. 31. 18:39
320x100

Java에 log4j 라는 오픈소스 로깅 라이브러리가 있듯이 C#에는 log4net 이라는 라이브러리가 있다.

 

log4net의 일반적인 사용법은 XML 파일에 log4net 관련 설정을 한 후, 

이 파일을 log4net의 XmlConfigurator.Configure() 함수로 등록하면 된다.

 

log4net의 설정 정보를 저장한 파일 내용

 

나는 지금까지 이 작업을 App.xaml.cs 파일에서 수행해왔다.

 

 

하지만 세상에 편한 일만 있을 순 없는 법.. 

 

내가 회사에서 만들고 있는 비디오 스트리밍 프로그램은 하나의 메인 프로그램이 있고,

1 ~ 25 개의 카메라 영상을 스트리밍 해주는 각각의 스트리밍 프로그램이 있다.

 

즉, 프로젝트는 하나인데 프로세스는 여러개가 실행되는 구조이고 각각은 자신들만의 로그 파일을 가지고 있어야 했다.

 

 

 

문제는 여기서 발생한다.

 

 

log4net을 기존의 XML 방식으로 사용하게 되면 여러 개의 프로세스가 동일한 로그 설정을 갖고 있게 된다.

이 설정 중에는 로그 파일의 저장 경로, 로그 파일의 이름도 포함된다.

 

나는 스트리밍 프로세스 각각의 로깅 정보가 있는 25개의 파일을 원하는 것이지,

25개 채널의 로깅 정보가 뒤엉켜있는 하나의 파일을 원하는 것이 아니었다.

 

구글 느님께 여쭤봐도 XML 방식으로는 도저히 답이 안 나왔다.

 

그래서 차선책으로 선택한 방식이 log4net의 Logger 클래스를 코드 상에서 직접 Create하는 방식이었다.

 

log4net에서는 Appender 클래스의 개념이 중요하다.

이 Appender가 실제적으로 로깅 정보를 어디에 저장할 지 결정하기 때문이다.

 

기존에 사용하던 XML 파일의 로깅 설정을 참고하여 구현한 Logger 생성 코드는 다음과 같다.

log4net의 Logger를 프로그래밍적으로 직접 Create 하는 코드

 

위 코드에서 중요한 게

를 반드시 호출해 주어야 한다는 점이다.

 

ActivateOptions() 함수가 호출되지 않으면 Logger는 로그 파일 생성 등의 동작을 일절 하지 않는다.

 

그리고

코드에서 원래는 XmlConfigurator 클래스 대신 BasicConfigurator 클래스를 사용했었다.

 

하지만 BasicConfigurator 는 기본적으로 Appender 리스트에 ConsoleAppender 클래스를 가지고 있어서

Console 창에 로깅 정보가 계속 기록되는 현상이 나타났다. 

 

나는 Console 창에는 로그 정보를 남기고 싶지 않았기 때문에 XmlConfigurator 클래스를 사용하였다.

 

BasicConfigurator 대신 XmlConfigurator를 사용할 때 아무런 조치도 취하지 않으면

 

log4net:ERROR Failed to find configuration section 'log4net' in the application's .config file. 

Check your .config file for the <log4net> and <configSections> elements. 

The configuration section should look like: 

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />

 

이런 에러가 발생한다.

 

이는 App.config 파일에 log4net 정보가 없어서 발생하는데 아래와 같이 log4net 정보를 추가해주면 이 에러가 사라진다.

log4net 라이브러리 정보를 App.config 파일에 추가한 코드

 

위의 과정으로 Logger를 생성하고 나니 각각의 스트리밍 프로세스 별로 개별적인 이름을 가진 로그 파일이 생성되었다.

 

25개의 프로세스가 25개의 로그 파일을 갖도록 하려는 목표가 드디어 성공한 것이다..!!

 

 

728x90
728x90
Comments