log4cxx

C++ 2010. 11. 6. 22:37
 
log4cxx
log4j 를 본따 c++ 버전으로 만든 ASF(http://apache.org/)의 OSS.
(log4j 메뉴얼을 참조해도 된다. 거의 비슷..)
 
로그 레벨 : ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
 
 
 
log4cxx 빌드 (Visual Studio 2008)


1. Download Installation File
Apache log4cxx  [ver 0.10.0]
 
Apache Portable Runtime (APR) [ver 1.4.2]
Apache Portable Runtime-util (APR-util) [ver 1.3.10]
 
GNU Sed [ver 4.2]
 
2. Installation
1. Decompress APR, APR-util, log4cxx File in same folder
ex) 아래와 같이 폴더 이름 변경 필수
c:\work\log4cxx\apr
 
c:\work\log4cxx\apr-util
c:\work\log4cxx\log4cxx
 
2. Install GNS sed 
Run "sed-4.2-1-setup.exe"
Add environment variable %PATH% : "C:\Program Files\GnuWin32\bin" 
 
3. In "cmd", move "C:\work\log4cxx\log4cxx" folder.
Run "configure.bat"
Run "configure-aprutil.bat"
 
4. Compile "C:\work\log4cxx\log4cxx\projects\log4cxx.dsw"
Result : log4cxx.dll, log4cxx.lib
("C:\work\log4cxx\log4cxx\projects\Debug or Release")
 
5. include file
C:\work\log4cxx\log4cxx\src\main\include
 
 
3. Visual Studio 2008 에서 사용하기 위한 설정 configuration
in Project Property Pages
"C/C++ > General > Additional Include Directories" : C:\work\log4cxx\log4cxx\src\main\include
"C/C++ > Linker > Additional Library Directories" : C:\work\log4cxx\log4cxx\projects\Debug
 
In .cpp
#pragma warning ( disable: 4231 ) 
#pragma comment(lib, "log4cxx.lib")
Log4cxx 용 (properties 설정 파일)


[log4cxx.conf]
# root logger setting
#log4j.rootLogger = DEBUG, console, filelog, chainsaw, rollingfile
log4j.rootLogger = DEBUG, filelog, console

# 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.filelog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.filelog.layout = org.apache.log4j.PatternLayout
log4j.appender.filelog.layout.ConversionPattern = [%d][%-5p](%L) - %m%n
log4j.appender.filelog.Append = true
log4j.appender.filelog.DatePattern = '.'yyyy - MM - dd
log4j.appender.filelog.File = testlog.log

# 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
[.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
	{
		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...");
	}
	catch (const Exception& e) {
		cout << "[ERROR] configure()\n" << e.what() << endl;
	}

	return EXIT_SUCCESS;
}
 
#pragma warning ( disable: 4231 )
컴파일시 다음 warning 보기 싫어서 넣음. c:\work\log4cxx\log4cxx\src\main\include\log4cxx\spi\configurator.h(57) : warning C4231: nonstandard extension used : 'extern' before template explicit instantiation 


 
Log4cxx - 사용 (xml 설정 파일)

[log4cxx.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/">

  <appender name="logConsoleAppender" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{ISO8601} [%-5p] [%c:%L] %m%n"/>
    </layout>
  </appender>
  <appender name="logRollingFileAppender" class="org.apache.log4j.RollingFileAppender">
    <param name="file" value="TestRolling500MB.log" />
    <param name="append" value="true" />
    <param name="MaxFileSize" value="500MB" />
    <param name="MaxBackupIndex" value="3" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{ISO8601} [%-5p] [%c:%L] %m%n"/>
    </layout>
  </appender>
aadafasf
  <appender name="logTimeRollingFileAppender" class="org.apache.log4j.rolling.RollingFileAppender">
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
      <param name="fileNamePattern" value="TestTimeRolling.%d{yyyy-MM-dd}.log"/> <!--Dailly-->
    </rollingPolicy>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{ISO8601} [%-5p] [%c:%L] %m%n"/>
    </layout>
  </appender>
  
  <root>
    <level value="debug" />
    <appender-ref ref="logConsoleAppender"/>
    <appender-ref ref="logRollingFileAppender"/>
    <appender-ref ref="logTimeRollingFileAppender"/>
  </root>

  <category name="testCategory" >
    <level value ="info" />
    <appender-ref ref="logTimeRollingFileAppender"/>
  </category>

</log4j:configuration>
 
 
 
[.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>
#include <log4cxx/xml/domconfigurator.h>

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

int main(void)
{
	try
	{
		string filePath = "log4cxx.conf";
		DOMConfigurator::configure(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...");
	}
	catch (const Exception& e) {
		cout << "[ERROR] configure()\n" << e.what() << endl;
	}

	return EXIT_SUCCESS;
}
 
 
**. log4cxx 사용법 reference
http://joygram.org/wiki/doku.php?id=log4cxx log4cxx 파일 안의 test 소스  



Log4cxx - 개인용 샘플
 
[사용]
#include "LoggerManager.h"

int main(void)
{
	wstring xmlfilepath = _T("log4cxx.xml");
	try
	{
		CLoggerManager::initialize(xmlfilepath);
	}
	catch (const Exception& e)
	{
		cout << "[ERROR] " << e.what() << endl;
	}

	CLogger logger = CLoggerManager::getRootLogger();
	if (logger.isDebugEnabled())
		logger.debug(wstring(_T("hi")));

	return 0;
}


 
 
Visual Studio 2010 에서 log4cxx 빌드

설치는 위에서 설명한 "log4cxx 빌드 (Visual Studio 2008)" 의 "1. Download Installation File" 와 "2. Installation" 까지 진행 후
log4cxx 솔루션 파일(log4cxx/projects/log4cxx.dsw) 을 Visual Studio 2010으로 열면 프로젝트 자동변환을 진행하고
아래 데로 변경하면 됩니다. (일단 32bit 기준)
설치 바이너리 버전 : apache-log4cxx-0.10.0.zip, apr-1.4.5-win32-src.zip, apr-util-1.3.12-win32-src.zip, sed-4.2.1-setup.exe
1. log4cxx 프로젝트
에러 유형 1. LOG4CXX_LIST_DEF 정의 관련..
log4cxx\src\main\include\log4cxx/helpers/simpledateformat.h(78): error C2252: 템플릿은 네임스페이스 범위에서만 명시적으로 인스턴스화할 수 있습니다.
LOG4CXX_LIST_DEF(..) 를 class 정의 밖으로 옮긴다. (namespace 정의 안, class 정의 밖)
LOG4CXX_LIST_DEF(ConnectionList, Connection); 의 경우 윗줄의
typedef log4cxx::helpers::SocketPtr Connection; 도 같이 옮긴다.
 
에러 유형 2. KeySet namespace 관련..
..\src\main\cpp\propertiespatternconverter.cpp(62): error C2039: 'KeySet' : 'log4cxx::spi::LoggingEvent'의 멤버가 아닙니다.
LoggingEvent::KeySet keySet 를 KeySet keySet으로 변경. (namespace 제거)
 
에러 유형 3. iterator 관련..
..\src\main\cpp\propertiespatternconverter.cpp(64): error C2065: 'const_iterator' : 선언되지 않은 식별자입니다.
#include <iterator> 추가
 
에러 유형 4. apr, aprutil 링크 에러
library 참조 수동 설정 필요.
아래와 같이 Debug, Release 에 대해 수동 설정. Debug는 LibD, Release는 LibR 폴더에 생성됨.
 
"log4cxx > 프로젝트 속성 > 링커 > 일반 > 추가 라이브러리 디렉토리 " 추가 (Release 모드는 LibD)
..\..\apr\LibD
..\..\apr-util\LibD
..\..\apr-util\xml\expat\lib\LibD
 
"log4cxx > 프로젝트 속성 > 링커 > 입력 > 추가 종속성 " 추가
apr.lib
aprutil.lib
xml.lib
 
 
2. apr 프로젝트 
 
D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1151,5): warning MSB8012: TargetPath(E:\SRC\NewBaseApp\WISM\Library\log4cxx\apr\.\LibR\apr.lib)이(가) Library의 OutputFile 속성 값(E:\SRC\NewBaseApp\WISM\Library\log4cxx\apr\LibR\apr-1.lib)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.
D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1153,5): warning MSB8012: TargetName(apr)이(가) Library의 OutputFile 속성 값(apr-1)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.
 
apr 프로젝트 속성의 "라이브러리 관리자 > 일반 > 출력 파일" 을 LibR\apr.lib 로 변경.
("일반>대상이름"과 일치 시키기. 디버그 모드는 LibD\apr.lib)
 

3. aprutil 프로젝트
 
D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1151,5): warning MSB8012: TargetPath(..\log4cxx\apr-util\.\LibR\aprutil.lib)이(가) Library의 OutputFile 속성 값(E:\SRC\NewBaseApp\WISM\Library\log4cxx\apr-util\LibR\aprutil-1.lib)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.
D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1153,5): warning MSB8012: TargetName(aprutil)이(가) Library의 OutputFile 속성 값(aprutil-1)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.
 
 
aprutil 프로젝트 속성의 "라이브러리 관리자 > 일반 > 출력 파일" 을 LibR\aprutil.lib 로 변경.
("일반>대상이름"과 일치 시키기. 디버그 모드는 LibD\aprutil.lib)
 
 
4. apr, aprutil, xml 빌드 후 log4cxx 프로젝트 빌드
log4cxx\projects\Debug 에 log4cxx.lib, log4cxx.dll 파일 생성
 


log4cxx 64 bit은 컴파일 구성 추가 후 빌드하면 된다는 것 같은데 아직 안해봤습니다.
 
 
 
 

'C++' 카테고리의 다른 글

MiniDump (미니 덤프 생성하기)  (0) 2010.11.13
Memory Pool (메모리 풀)  (1) 2010.11.13
virtual 와 상속 속성  (0) 2010.11.10
stable priority queue  (0) 2010.11.08
Singleton (싱글톤)  (0) 2010.11.05
Win32 메모리 누수(Leak) 체크  (1) 2010.11.04
Distributed Environment (분산 환경)  (0) 2010.11.04
ATL (Active Template Library)  (0) 2010.11.04