반응형

log4cxx.liblog4cxx.dll을 컴파일 해서 추출을 해냈으니 이제는 이것을 적용해서 실제 log4cxx를 쓸수 있도록 해야 한다.

 

 

간단하게 과정을 선요약하고 시작하자면

 

1. 프로젝트 생성

2. 프로젝트 속성 -> 구성 속성 -> C/C++ -> 추가포함디렉토리 : log4cxx 헤더파일 경로

3. 프로젝트 속성 -> 구성 속성 -> 링커 -> 일반 -> 추가라이브러리디렉터리 : log4cxx.lib 파일 경로

4. 프로젝트 속성 -> 구성 속성 -> 링커 -> 입력 -> 추가종속성 : log4cxx.lib 입력 후 추가

5. log4cxx.dll을 실행경로에 복사

6. log4cxx.properties 설정파일 작성 및 폴더 복사

가 있다.

 

 

 

 

1. Visual Studio 2012에서 새로운 빈 프로젝트(Win32 콘솔 응용 프로그램)를 생성한다.

 

2. 생성된 프로젝트에서 main으로 쓸 cpp 파일 하나 생성 한다.

 

3. 다음과 같은 코드를 방금 만든 cpp 파일에 복사 및 붙여넣기 한다(샘플 코드)


#include <windows.h>
#include <string>
#include <iostream>
using namespace std;

#pragma warning ( disable: 4231 ) 
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/exception.h>

#pragma comment(lib, "log4cxx.lib")
using namespace log4cxx;
using namespace log4cxx::helpers;

int main(void)
{
	try
	{		
		while(1){
		string filePath = "log4cxx.conf";
		PropertyConfigurator::configure(File(filePath));

		LoggerPtr rootlog = Logger::getRootLogger();
		LoggerPtr log = Logger::getLogger("");

		LOG4CXX_FATAL(log, "fatal output...");
		LOG4CXX_ERROR(log, "error output...");
		LOG4CXX_WARN (log, "warn  output...");
		LOG4CXX_INFO (log, "info  output...");
		LOG4CXX_DEBUG(log, "debug output...");
		Sleep(1000);
		}
	}
	catch(const Exception& e) {
		cout << "[ERROR] configure()\n" << e.what() << endl;
	}

	return EXIT_SUCCESS;
}

 







 

4. 그냥 바로 붙여넣기를 하면 아래와 같이 온갖 오류가 발생할 것이다. 이것은 log4cxx의 헤더가 추가 되지 않아서 그런 것이다. 헤더를 추가해야 한다.


=> 헤더를 추가하는 방법은 다음과 같다.

 

Alt + F7 키를 누르면 속성 페이지에 들어오게 된다. 속성 창에서 C/C++ - 일반 추가포함 디렉토리에서 log4cxx의 헤더파일들이 존재하는 폴더 경로를 지정하면 된다.

 

대체로 apache-log4cxx-0.10.0/src/main/include/log4cxx에 존재하나 없을 경우

 

윈도우에서 logger.h를 검색해서 나오는 결과 파일의 경로를 찾아도 된다.

 

여기서 중요한 것은 /src/main/include/log4cxx까지 왔을 때 log4cxx 폴더를 경로로 잡는 것이 아니라 include 폴더를 경로로 잡아야 한다.

 

apache-log4cxx-0.10.0/src/main/include를 경로로 잡을 것.


<오류 투성이의 코드들... 헤더가 적용이 되지 않아 그렇다 >


<log4cxx 라는 폴더 안에 헤더파일이 몽땅 들어있다>

< 추가포함 디렉터리에 log4cxx 폴더 경로를 지정하면 오류들이 모두 사라진다.>


 

그러면 위와 같이 오류들이 모두 사라진다.

 

 








5.
이제 log4cxx 라이브러리 파일의 경로를 지정해줘야 한다.

 

나 같은 경우 생성한 프로젝트 폴더 안에 lib이라는 폴더를 임의로 만든 다음 log4cxx.lib의 파일을 옮겼다.

 

이렇게 하면 경로가 단순해지고 라이브러리 파일이 어디있는지 알아보기가 쉽다.

예를 들어 나는 Test라는 프로젝트를 만들어 지금 소스 코드를 입력했으니

 

Test 프로젝트 폴더 안에 만든 것이다.




위와 같이 라이브러리 파일을 집어 넣었다.(폴더명도 lib이라는 것이 보일것이다)

 

이제 이 라이브러리 파일이 있는 경로를 지정해주면 된다.

 

속성(Alt + F7) - 구성 속성 링커 일반 추가 라이브러리 디렉터리에서 경로를 지정해주면 된다.

 

 

 





6. 마지막으로 log4cxx.lib을 입력만 해주면 된다.

 

속성 구성 속성 링커 입력 추가 종속성에서 log4cxx.lib을 입력해서 확인

 

 

 


 

 

 

7. 이제 비주얼 스튜디오 내에서의 설정은 끝났고 컴파일해서 얻었던 log4cxx.dll을 옮겨야 한다. 그렇게 하기 위해선 우선 복붙해놓은 소스코드를 빌드 시켜 프로그램으로 만들어야 한다. Ctrl + Alt + B를 눌러 빌드 시킬 것.

 

그렇다면 프로젝트 폴더에 Debug라는 폴더가 생성되며 exe 파일이 생성되어 있다.

 

Debug 폴더에 컴파일해서 만들어 놓은 log4cxx.dll을 복사해둔다.

 







 

8. Test.execmd를 이용해 실행시킨다. cmd에서 Test.exe가 위치한 폴더로 이동시킨 다음 Test.exe를 입력하여 엔터를 친다.

 

 

 

 

그러면 이렇게 에러가 발생한다. 이 이유는 log4cxx.conf 파일 즉 설정파일이 없기 때문이다.


영어를 읽을줄 안다면 configuration file인 log4cxx.conf를 read 할수 없다라는 말이 고스란히 적혀 있다.

 

아까전 복붙했던 소스 코드를 잘 보면 filePathlog4cxx.conf로 되어있는데 이것은 컴퓨터공학을 전공했던 사람들이라면 누구나 알겠지만 log4cxx.conf 파일이 실행파일과 같은 위치에 있어야 한다는 것을 의미한다. 그러니 log4cxx.conf를 만들고 설정을 하면 된다.

 

 


9.
메모장에 아래와 같은 내용을 집어넣고 저장할 때 log4cxx.conf라고 저장한다음 아까전 실행파일이 위치했던 곳으로 복사시킨다.

 


# root logger setting
#log4j.rootLogger=DEBUG, console, filelog, chainsaw, rollingfile
log4j.rootLogger=console,FILE,rollingfile

# using console appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{ISO8601} [%-5p] %c(%L) : %m%n
#log4j.appender.console.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n


# using rolling file appender
log4j.appender.rollingfile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingfile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingfile.File=Rlog.txt
log4j.appender.rollingfile.layout.ConversionPattern=[%d] [%-5p] (%L) - %m%n
log4j.appender.rollingfile.MaxFileSize=500MB
log4j.appender.rollingfile.MaxBackupIndex=3

# using filelog appender
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.DatePattern='Main-'yyyy-MM-dd-HH-mm'.log'
log4j.appender.FILE.Append=true
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.DateFormat=ISO8601
log4j.appender.FILE.layout.ConversionPattern=%d %-4r [%t] %-5p %c %x - %m%n

# using chainsaw appender
log4j.appender.chainsaw=org.apache.log4j.net.SocketAppender
log4j.appender.chainsaw.remoteHost=localhost
log4j.appender.chainsaw.port=4445
log4j.appender.chainsaw.locationInfo=true 

 


 

 

 

10. 이제 다시 cmd를 이용해 Test.exe를 실행시키면 실행도 제대로 되고 Main으로 시작하는 로그 파일도 생성이 된다. 로그 파일을 열어보면 프로그램이 실행하면서 출력했던 내용들이 고스란히 기록되어 있다.

 

 

 < 더이상 에러가 발생되지 않는다. 그리고 분 단위로 로그가 생성되는 것을 실시간으로 확인할수 있다>

 

 

<이렇게 로그가 생성되는 것을 확인 할수 있다. 프로그램이 꺼지지 않는한 이 로그는 계속 생성 될 것이다>

 

 

 

 

 

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 


로그를 남기는 것은 상당히 중요한 일이다. 특히 현업에서 개발자로서 일을 한다면 더욱더 그렇다.


만약 어떠한 프로그램에 문제가 생겼을 경우 이 프로그램이 어디서 문제가 생겼는지 찾는 것은 대단히 어려운 일이다. 왜냐하면 대체로 개발하는 프로그램들은 테스트를 할때 기본적으로 며칠은 계속 구동을 시켜놓기 때문이다. 


이렇게 스트레스 테스트를 하여서 나오는 오류를 잡아야 하는데 사람이 며칠 동안 컴퓨터만 계속 쳐다볼수 없는 노릇이므로 로그를 남기게 해서 오류가 생겼을시에 언제, 몇시, 어느 부분에서 문제가 생겼는지 명확히 알수 있게 된다.

 

 또한 책임을 명확하게 할수도 있다. 혹여나 프로그램이 오류가 생겼는데 고객사와의 관계 혹은 특정한 경우에 의해서 그 잘못을 뒤집어 쓰는 경우가 생길수도 있는데 로그를 정확하게 남긴다면 이런 책임소재를 명확히 할수 있다. 특히 대단히 큰 프로젝트를 맡아 여러 회사와 같이 협업을 하는 경우가 있다면 더욱더 이런 책임소재를 명확히 할 필요가 있다.


로그를 남기는 버릇을 들여 어떠한 상황에서도 반드시 로그를 남기는 개발을 하여야 할것이며 그 일은 log4cxx가 C++ 환경의 개발에서 책임을 져줄것이다.



 







+ Recent posts