log4cxx - Visual Studio 빌드
저장소/VC++Visual Studio 2012에서 log4cxx를 빌드할 때 한 번에 쉽게 되지가 않더라.. ㅠㅠ
좋은 내용이 있어서 담아본다. 아래 내용 참고.
원문 출처 : http://yamoe.tistory.com/173
log4cxx
log4j 를 본따 c++ 버전으로 만든 ASF(http://apache.org/)의 OSS.
(log4j 메뉴얼을 참조해도 된다. 거의 비슷..)
로그 레벨 : ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
log4cxx site : http://logging.apache.org/log4cxx/
log4cxx API : http://logging.apache.org/log4cxx/apidocs/index.html
log4j manual : http://blogimg.chinaunix.net/blog/upfile2/081221005440.pdf
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 설치 reference 사이트 http://sado13th.tistory.com/12 http://blog.naver.com/kkt3212/100102083844 http://www.yolinux.com/TUTORIALS/Log4cxx.html |
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 설정 파일)
<?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> |
[.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 - 개인용 샘플
[사용]
#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 폴더에 생성됨.
아래와 같이 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)
("일반>대상이름"과 일치 시키기. 디버그 모드는 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)
("일반>대상이름"과 일치 시키기. 디버그 모드는 LibD\aprutil.lib)
4. apr, aprutil, xml 빌드 후 log4cxx 프로젝트 빌드
log4cxx\projects\Debug 에 log4cxx.lib, log4cxx.dll 파일 생성
log4cxx 64 bit은 컴파일 구성 추가 후 빌드하면 된다는 것 같은데 아직 안해봤습니다.
'저장소 > VC++' 카테고리의 다른 글
gtest VS2012에서 에러 - error C2977: 'std::tuple' : too many template arguments (0) | 2013.03.08 |
---|---|
warning LNK4099 (0) | 2013.03.08 |
Visual C++ (2012) 링커 옵션 (0) | 2013.03.07 |
error LNK2005 - uafxcw.lib, LIBCMT.lib (0) | 2013.03.06 |
[펌] 링크시 나는 에러 추적 하기 (0) | 2013.03.06 |