728x90

프로젝트를 하다 보니, 자연스럽게 log4net을 사용하게 되었다.
Visual Studio의 IDE 기반으로 된 디버그 기능은 매우 훌륭해서, 브레이크 포인트를 잡고 하는 디버깅을 사용하면 보다 쉽고 편하게 할 수 있지만, 간혹 백그라운드로 동작하는 기능이나, 데이터 흐름의 끊김 없이 쭉 보고자 할 때는 역시 로그 기능은 필수이다.
대개 실행 프로그램 프로젝트( WinForm 프로젝트, 콘솔 프로그램 프로젝트 )의 경우 app.config 라는 XML 기반 설정 파일을 잘 구성해서 넣어주면 log4net을 바로 쓸 수 있다. 설정도 바로 app.config 내에서 수정하면 즉시 즉시 발동되니 편하다.
그런데, 이번 프로젝트는 DLL 기반의 프로젝트로, 해당 DLL은 외부 프로그램에서 Run을 해주게 된다. 이러다 보니, 외부 프로그램에서 log4net을 활성화 시켜주지 않는 이상 내가 만드는 c# dll 안에서는 도무지 로그를 쌓을 수 없었다.

고민 고민하다가, 이전에 만들어 놓았던, log4net용 관리 클래스를 꺼내봤는데, 생각보다 그다지 썩 좋지 않은 방법을 이곳 저곳을 써서 그대로 쓸 수 없었다. 게다가, 설정 기능을 이리저리 끊어놔서 생각보다 쉽지는 않았다.

그래서 아예 Log 기능을 활성화시키는데 주안점을 두고 정리해봤다.

아래의 코드가 log4net을 활성화 시키는 코드들이다.

// log4net의 기본 구조를 꺼낸다.
// log4net의 기본 구조를 꺼낸다.
log4net.Repository.Hierarchy.Hierarchy hierarchy = (log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository();
// log4net의 설정 기능을 활성화 시킨다.
hierarchy.Configured = true;

// log4net을 이용하여 로깅을 할 때, 어떤 방식으로 로그를 남길지를 설정한다.
// 파일, DB, 이벤트로그, 등등 다양한 위치에 로그를 쌓을 수 있는데,
// 아래의 예제는 RollingFile 기반 ( 일정 사이즈가 되거나, 날짜가 변경되면 자동으로 새로운 파일을 생성해서 로그를 
// 남기는 방식 )으로 구현했다.
// 만약 다른 방식으로 변경하려면, rollingAppender의 클래스와 설정을 변경하면 된다.
log4net.Appender.RollingFileAppender rollingAppender = new log4net.Appender.RollingFileAppender();
rollingAppender.File = @"C:\DEV\Log\cupps.log";
rollingAppender.AppendToFile = true;
// RollingFile 방식을 설정한다.
rollingAppender.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Composite;
// 로그 파일 최대 크기를 설정한다.
rollingAppender.MaxFileSize = 1024 * 1024 * 2;
// 로그 파일 작성시, 동시 Write 방지 Locking Model 방식을 설정한다.
rollingAppender.LockingModel = new log4net.Appender.FileAppender.MinimalLock();
// 날짜 변경시 기존 로그 파일이름을 어떤식으로 변경할지에 대해서 설정한다.
rollingAppender.DatePattern = "_yyyyMMdd\".log\"";
// 로그 파일 내에 로그(한 줄)를 어떤식으로 기록할지에 대한 Format을 설정한다.
log4net.Layout.PatternLayout layout = new log4net.Layout.PatternLayout("%date %-5level %logger - %message%newline");
rollingAppender.Layout = layout;
// 위에서 설정한 Appender 섲렁을 활성화시킨다.
rollingAppender.ActivateOptions();
// Logger에다가 위에서 설정한 Appender를 추가한다.
hierarchy.Root.AddAppender(rollingAppender);
// 여기까지가 Appender 추가 방법.

// 로그를 남기는 레벨 설정 ( INFO, DEBUG, WARN, ERROR, ALL 등이 있다 )
hierarchy.Root.Level = log4net.Core.Level.All;

이 활성화는 프로그램 맨 처음에 한번만 해주면 된다.

로그를 남기려면 클래스 맨 앞에 static 형태로 변수 하나 설정한 뒤, 그 변수를 이용하여 로그를 남기면 된다.
다음 예제 클래스가 그 용도다.

class Class1
{
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    public Class1()
    {
        log.Debug("Enter Constructer~");
    }
}

static을 이용해 log 라는 변수를 생성한 뒤, 로그를 쌓고 싶은 곳에서 log. 이라는 것으로 시작하여 로그를 기록하면 된다. 매 클래스에서 저 static 변수를 모두 넣는 것이 좋다. 그 이유는 로그를 쌓을 때, 어느 클래스에서 발생된 로그인지를 바로 알 수 있기 때문이다.

앞서 로그를 설정할 때, PatternLayout 이라는 값을 설정했다.

 %date %-5level %logger - %message%newline 

이 값들 중, %logger 부분이 로그를 발생시킨 대상을 표시하는 영역이 되는데, %logger 에 들어갈 문장을 "System.Reflection.MethodBase.GetCurrentMethod().DeclaringType"를 통해 넣게 되는 것이다.
그러면 아래와 같은 로그가 쌓이게 된다.

2014-10-23 17:23:11 DEBUG MyApps.Class1 - Enter Constructor ~

"MyApps.Class1" 이라는 부분이 그 부분이다.

귀찮더라도, 매 클래스 마다 아래의 줄을 추가하면 최소한 그 클래스 내부에서 로그를 쌓을 때 편하게 로그를 작성해서 구성할 수 있게 된다.

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
728x90

+ Recent posts