정리

log4cxx - Visual Studio 빌드

저장소/VC++

Visual Studio 2012에서 log4cxx를 빌드할 때 한 번에 쉽게 되지가 않더라.. ㅠㅠ
좋은 내용이 있어서 담아본다. 아래 내용 참고.




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은 컴파일 구성 추가 후 빌드하면 된다는 것 같은데 아직 안해봤습니다.